반응형
내부 조인
내부조인은 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 |