일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 멱등활용
- 김영한JPA
- http
- anyMatch
- Transaction not successfully started
- KAKAOLOGINAPI
- SpringBoot
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- 매핑정보가없는필드
- @Entity
- 자바ORM표준프로그래밍
- gitreset
- 캐쉬가능
- Invalid bound statement (not found)
- Git
- @Table
- 네이버 연결된 서비스
- 네이버로그인API
- 데이터베이스 방언
- org.apache.ibatis.binding.BindingException
- fixedDelay
- 무상태프로토콜
- JPA
- gitrevert
- hibernate.dialect
- RFC723x
- DB방언
- HTTPMESSAGE
- initialDelay
- HTTP3
Archives
- Today
- Total
twocowsong
연관관계 조회 본문
연관관계가 있는 엔티티를 조회하는 방법은 크게 2가지입니다.
- 객체 그래프 탐색(객체 연관관계를 사용한 조회)
- 객체지향 쿼리 사용(JPQL)
방금 저장한 대로 회원1, 회원2가 팀1에 소속되어있습니다.
객체 그래프 탐색
member.getTeam()을 사용해서 member와 연관된 team엔티티를 조회할 수 있습니다.
Member member = em.find(Member.class, "member1");
// 객체 그래프 탐색
Team team = member.getTeam();
System.out.println("팀 이름 : " + team.getName());
// 출력 결과 : 팀 이름 : 팀1
위처럼 객체를 통해 연관된 엔티티를 조회하는것을 객체 그래프 탐색이라고 합니다.
- 객체지향 쿼리 사용
객체지향 쿼리인 JPQL에서 연관관계를 어떻게 사용하는지 확인해보겠습니다.
회원을 대상으로 조회하는데 팀1에 소속된 회원만 조회하려면 회원과 연관된 팀 엔티티를 검색조건으로 사용해야 합니다.
SQL은 연관된 테이블을 조인해서 검색조건을 사용하면됩니다.
JPQL도 조인을 지원하지만 문법이 약간다릅니다.
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("jpa-study");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
queryLogicJoin(em);
tx.commit();
}
catch (Exception e) {
tx.rollback();
}
}
public static void queryLogicJoin(EntityManager em) {
String jqpl = "select m from Member m join m.team t where " +
"t.name=:teamName";
List<Member> resultList = em.createQuery(jqpl, Member.class)
.setParameter("teamName", "팀1")
.getResultList();
resultList.forEach(obj -> {
System.out.println("[query] member.username = " + obj.getUsername());
});
}
queryLogicJoin 결과는 아래와 같습니다.
[query] member.username = 회원1
[query] member.username = 회원2
JPQL의 from 부분을 보면 회원이 팀과 관계를 가지고 있는 필드를 통해서 Member와 Team을 조인했습니다.
from Member m join m.team t
where절을 보면 조인한 t.name을 검색조건으로 사용해서 팀1에 속한 회원만 검색하였습니다.
:teanName과 같이 :로 시작하는 것은 파라미터를 바인딩으로 받는 문법입니다.
where t.name=:teamName
완성된 JPQL은 안래와 같습니다.
select m from Member m join m.team t where t.name=:teamName
이때 실행되는 SQL은 다음과 같습니다.
SELECT M.MEMBER_ID,
M.USERNAME,
M.TEAM_ID
FROM MEMBER M
INNER JOIN TEAM T
ON M.TEAM_ID = T.TEAM_ID
WHERE T.NAME = '팀1'
실행된 SQL과 JQPL을 비교하면 JPQL은 객체를 대상으로 하고 SQL보다 간결합니다.
'IT > JPA' 카테고리의 다른 글
연관관계 제거 (0) | 2022.06.01 |
---|---|
연관관계 수정 (0) | 2022.06.01 |
연관관계 사용 (0) | 2022.05.29 |
@ManyToOne (0) | 2022.05.28 |
@JoinColumn (0) | 2022.05.28 |