Fetch Join은 연관 관계가 있는 엔티티를 한 번의 쿼리로 함께 조회할 수 있게하는 JPQL 키워드 이다.
@Query("SELECT p FROM Post p JOIN FETCH p.comments WHERE p.user.username = :username")
List<Post> findAllWithCommentsByUsername(@Param("username") String username);
SELECT p.*, c.* FROM post p
JOIN comment c ON p.id = c.post_id
WHERE p.user_id = ?;
사용법은 다음과 같으며, JOIN FETCH 키워드를 사용하면 연관된 엔티티들을 SQL의 JOIN으로 함께 가져오기 때문에 추가적인 쿼리가 발생하지 않는다.
Pagable이 정상 작동하지 않는다Fetch Join 금지 : JPA는 1개 이상의 컬렉션 Fetch Join이 안된다DISTINCT를 사용하여 중복된 엔티티 제거가 필요하다JPA는 중복을 자동으로 제거시켜준다.
JPQL이 객체 기준으로 중복을 제거하고(equals & hashCode 기준) 중복없이 잘 병합된다.
하지만, Fetch Join은 항상 중복의 가능성을 내포하고 있기떄문에 성능 저하, 페이징 깨짐 등의 문제는 항상 존재한다.