JPQL 페치 조인 (fetch join) - ①
JPQL fetch join
- SQL 조인 종류가 아니다.
- JPQL에서 성능 최적화를 위해 제공하는 기능으로 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다.
- join fetch 명령어를 사용한다.
ex) 회원을 조회하면서 연관된 팀도 같이 조회하고 싶다.
JPQL 쿼리 → select m from Member m join fetch m.team
실제 동작하는 SQL 쿼리 → SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID
컬렉션 페치 조인
일대다 관계, 컬렉션 페치 조인
JPQL 쿼리 → select t from Team t join fetch t.members where t.name = ‘팀A'
실제 동작하는 SQL 쿼리 → SELECT T.*, M.* FROM TEAM T INNER JOIN MEMBER M ON T.ID=M.TEAM_ID WHERE T.NAME = '팀A'
*다대일 관계와는 다르게 일대다 관계일 때는 데이터가 중복 되는 부분을 조심해야 한다.
따라서 중복을 DISTINCT 로 제거해야 한다.
단 주의 할점은 완전히 똑같은 상태일 경우에만 중복 제거가 되기 때문에 일반 DISTINCT가 아닌 JPQL에서 제공하는 DISTINCT를 사용 해야 한다. (사용 방법은 똑같기 때문에 distinct 를 추가로 넣어주면 됨)
JPQL의 DISTINCT 2가지 기능
- SQL에 DISTINCT 기능
- 애플리케이션에서 엔티티 중복을 제거
페치조인과 일반 조인의 차이
일반 조인 실행시 연관된 엔티티를 함께 조회하지 않음
JPQL join 쿼리 → select t from Team t join t.members m where t.name = ‘팀A'
실제 동작하는 SQL 쿼리 → SELECT T.* FROM TEAM T INNER JOIN MEMBER M ON T.ID=M.TEAM_ID WHERE T.NAME = '팀A'
JPQL join fetch 쿼리 → select t from Team t join fetch t.members where t.name = ‘팀A'
실제 동작하는 SQL 쿼리 → SELECT T.*, M.* FROM TEAM T INNER JOIN MEMBER M ON T.ID=M.TEAM_ID WHERE T.NAME = '팀A'
페치 조인과 일반 조인의 차이
join은 결과를 반환할 때 연관관계 고려하지 않고 단지 SELECT 절에 지정한 엔티티만 조회한다.
fetch join은 연관된 엔티티도 함께 조회한다. 결국 객체 그래프를 SQL 한 번에 조회하는 개념이다.