JPA/JPQL

[JPA] 묵시적 조인보다는 명시적 조인

IT록흐 2023. 6. 15. 18:46
반응형

 

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는 묵시적 조인을 지원하지만 명시적 조인을 사용하는 것이 좋다. 

 

 


 

참고자료

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

 

반응형