1:N 관계의 테이블에서 나타나는 문제이다.
(예를들면 부서[dept]와 사원[employee] 관계, 1개의 부서에 10명의 사원이 종속되어 있다고 가정한다.)
// 부서를 조회하는 쿼리
List<Department> dept = deptRepository.findAll();
위 쿼리를 실행시키면 . . .
# Hibernate Log
1 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
2 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
3 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
4 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
5 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
6 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
7 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
8 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
9 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
10 SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
Hibernate는 위 코드처럼 행 개수만큼 조회를 한다.(10명의 사원만큼)
(임의로 적는거라 Hibernate 쿼리랑은 다를 수 있지만 10개 조회한다는 내용만 숙지 할 것)
@Query("select d from department d join fetch d.employees")
List<Department> findAllJoinFetch();
위 현상을 해결하기위해 fetch join 을 사용한다.
JPA Repository에서 지원하진 않고 JPQL로 수기 작성 해야 함.
단점은 FetchType을 사용할 수 없고 페이징처리를 못 함