반응형
JPA는 JPA Parser가 JPQL을 파싱하면서 연관된 엔티티를 참조하는 경우, JOIN이 없어도 JOIN절을 생성하는 묵시적 조인을 지원한다.
Member 엔티티는 Team 엔티티와 연관된다.
JPQL에서는 연관된 엔티티를 '.'으로 접근할 수 있다.
String jpql1 = "SELECT distinct m.team FROM Member m ";
TypedQuery<Team> typedQuery1 = entityManager.createQuery(jpql1,Team.class);
List<Team> results1 = typedQuery1.getResultList();
JPQL은 JOIN문은 없고 '.'으로 연관 엔티티에 접근하였다. 그럼 정말 JPA(하이버네이트)가 자동으로 JOIN문을 만드는지 확인해보자.
INNER JOIN을 확인할 수 있다. 이처럼 JPA는 묵시적으로 JOIN문을 자동생성한다.
묵시적 조인보다는 명시적 조인
JPA가 묵시적 조인을 지원하지만 되도록이면 명시적 조인을 이용하는 것이 좋다.
--묵시적 조인
SELECT distinct m.team
FROM Member m
--명시적 조인
SELECT distinct m
FROM Member m
JOIN m.Team t
--컬렉션 명시적 조인
SELECT m.username
FROM Team t
JOIN t.members m
JOIN은 중요한 연산으로 개발자 눈에 보이도록 설정하는 것이 좋다. 연관된 객체가 컬렉션이면 묵시적조인이 아닌 명시적 조인을 사용하므로 하나로 통일해야 혼란을 주지 않는다. 이렇듯, JPA는 묵시적 조인을 지원하지만 명시적 조인을 사용하는 것이 좋다.
참고자료
반응형
'JPA > JPQL' 카테고리의 다른 글
[JPA] 상속관계에서 JPQL ( TYPE, TREAT ) (0) | 2023.06.16 |
---|---|
[JPA] 페치 조인 ( JOIN FETCH ) (0) | 2023.06.15 |
[JPA] 쿼리결과 변환하기 ( JPQL 함수 ) (0) | 2023.06.14 |
[JPA] 서브쿼리 ( SubQuery ) (0) | 2023.06.14 |
[JPA] JOIN 과 JOIN FETCH의 차이 (0) | 2023.06.14 |