JPQL JOIN
JPQL도 조인을 지원한다. SQL 과 조인 기능은 같고 문법만 약간 다르다.
🟣 내부 조인
내부 조인은 INNER JOIN 을 사용한다. 참고로 INNER 를 생략할 수 있다.
String teamName = "TEAM1"
String query = "SELECT m FROM Member m INNER JOIN m.team t WHERE t.name = :teamName"
List<Member> members;
members = em.createQuery( query, Member.class ).setParameter("teamName", teamName).getResultList();
회원과 팀을 내부 조인해서 'TEAM1' 에 소속된 회원을 조회하는 다음 JPQL 을 보자.
SELECT m FROM Member m INNER JOIN m.team t WHERE t.name = :teamName
JPQL 내부 조인 구문을 보면 SQL의 조인과 약간 다른 것을 확인 할 수 있다.
JPQL 조인의 가장 큰 특징은 연관 필드를 사용한다는 것이다.
여기서 m.team 이 연관필드인데 연관 필드는 다른 엔티티와 연관관계를 가지기 위해 사용하는 필드를 말한다.
- FROM Member m
- 회원을 선택하고 m 이라는 별칭을 주었다.
- Member m JOIN m.team t
- 회원이 가지고 있는 연관 필드로 팀과 조인한다.
- 조인한 팀에게는 t 라는 별칭을 주었다
혹시라도 JPQL JOIN 을 SQL JOIN 처럼 사용하면 문법 오류가 발생한다.
JPQL 은 JOIN 명령어 다음에 조인할 객체의 연관 필드를 사용한다.
🟣 외부 조인
외부 조인은 기능상 SQL JOIN 과 같다.
OUTER 는 생략 가능해서 보통 LEFT JOIN 으로 사용 가능하다.
JPQL
SELECT m FROM Member M LEFT [OUTER] JOIN m.team t
SQL
SELECT M.ID AS ID
, M.AGE AS AGE
FROM MEMBER M LEFT OUTER JOIN TEAM T ON M.TEAM_ID = T.ID
WHERE T.NAME = ?
🟣 컬렉션 조인
일대다 관계나 다대다 관계처럼 컬렉션을 사용하는 곳에 조인하는 것을 컬렉션 조인이라 한다.
- [ 회원 - > 팀 ] 으로의 조인은 다대일 조인이면서 단일 값 연관 필드( m.team )를 사용한다.
- [ 팀 - > 회원 ] 은 반대로 일대다 조인이면서 컬렉션 값 연관 필드( m.members )를 사용한다.
여기서 t LEFT JOIN t.members 는
팀과 팀이 보유한 회원 목록을 컬렉션 값 연관 필드로 외부 조인했다.
SELECT t , m
FROM Team t LEFT JOIN t.members m
컬렉션 조인 시 JOIN 대신에 IN 을 사용할 수 있는데 기능상 JOIN 과 같지만 콜렌션 일 때만 사용할 수 있다.
과거 EJB 시절의 유물이고 특별한 장점도 없으므로 그냥 JOIN 문 사용하자.
SELECT t, m FROM Team t, IN ( 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
🟣 JOIN ON 절 ( JPA 2.1 만 지원 )
ON 절을 사용하면 조인 대상을 필터링하고 조인할 수 있다.
참고로 내부 조인의 ON 절은 WHERE 절을 사용할 떄와 결과가 같으므로
보통 ON 절은 외부 조인에서만 사용한다.
JPQL
SELECT m, t FROM Member m LEFT JOIN m.team t ON t.name = 'BIN'
SQL
SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.Team_id AND t.name = 'BIN'
'개발중 > Java Persistence API (JPA)' 카테고리의 다른 글
[ JPA ] Save 후 Id 구하기 (0) | 2021.12.05 |
---|---|
[JPA] 연관 관계 정리 (0) | 2021.08.15 |
JPA - 프로젝션 (0) | 2021.07.01 |
JPA - 결과 조회 getResultList/getSingleResult (0) | 2021.07.01 |
JPA - 파라미터 바인딩 (0) | 2021.07.01 |