JPQL 조인

2023. 10. 10. 15:58JPA

반응형

내부 조인
내부조인은 INNER JOIN을 사용하고, INNER는 생략할 수 있다.

String teamName = "팀A";
String query = "SELECT m FROM Member m INNER JOIN m.team t "
   +"WHERE t.name = :teamName";
   
List<Member> members = em.createQuery(query, Member.class)
   .setParameter("teamName", teamName)
   .getResultList();

회원과 팀을 내부 조인해서 '팀A'에 소속된 회원을 조회한다.

 

외부 조인

SELECT m
FROM Member m LEFT [OUTER] JOIN m.team t

다음과 같이 사용하고, OUTER는 생략 가능하다.

 

컬렉션 조인

일대다 관계나 다대다 관계처럼 컬렉션을 사용하는 곳이 조인하는 것을 컬렉션 조인이라 한다.

  • [회원 → 팀] 으로의 조인은 다대일 조인이면서 단일 값 연관 필드(m.team)를 사용한다.
  • [팀 → 회원] 은 반대로 일대다 조인이면서 컬렉션 값 연관 필드(m.members)를 사용한다.
SELECT t, m FROM Team t LEFT JOIN t.members m

팀과 팀이 보유한 회원목록을 컬렉션 값 연관 필드로 외부 조인했다.

 

세타 조인

WHERE 절을 사용해서 세타조인을 할 수 있다. 참고로 세타 조인은 내부 조인만 지원한다. 세타 조인을 사용하면 전혀 관계없는 엔티티도 조인할 수 있다.

회원 이름이 팀 이름과 똑같은 회원 수를 구하는 예이다.

//JPQL
select count(m) from Member m, Team t
where m.username = t.name;

//SQL
SELECT COUNT(M.ID)
FROM MEMBER M CROSS JOIN TEAM T
WHERE M.USERNAME = T.NAME;

예제를 보면 전혀 관련없는 Member.username 과 Team.name을 조인한다.

 

JOIN ON 절

JPA 2.1 부터 조인할 때 ON 절을 지원한다. ON 절을 사용하면 조인 대상을 필터링하고 조인할 수 있다. 참고로 내부 조인의 ON절은 WHERE절과 같으므로 보통 ON 절은 외부 조인에서만 사용한다.

//JPQL
select m,t from Member m
left join m.team t on t.name = 'A';

//SQL
SELECT m.*, t.* FROM Member m
LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A';
반응형

'JPA' 카테고리의 다른 글

JPQL - 경로 표현식  (4) 2023.10.23
JPQL - 페치 조인(Fetch Join)  (0) 2023.10.12
JPQL - (기본 문법, 쿼리 API, 페이징 API, 집합과 정렬)  (0) 2023.09.25
객체지향 쿼리 언어 소개  (0) 2023.09.22
값 타입  (0) 2023.09.22