JPA

[JPA] Fetch Join과 Paging 동시 사용 충돌

어떻게말이름이히힝 2025. 1. 3. 21:57

페이징을 하기 위해선 전체 카운트가 있어야한다.

그래야 아래 사진처럼 몇페이지까지 있는지 페이징 메타 데이터 제공이 가능하다.

 

여기서 왜 문제가 생기냐면

보통 JPA는 무조건 countQuery를 하게 되는데 JPA가 이 FETCH JOIN이 담긴 쿼리를 기반으로 countQuery를 지멋대로 작성해버린다. 그렇기 때문에 아래 코드와 같이 countQuery를 명시적으로 작성해주게 되면 이 오류가 풀리게 된다.

@Query(value = "SELECT t FROM Todo t JOIN FETCH t.user u ORDER BY t.modifiedAt DESC"
      ,countQuery = "SELECT COUNT(t) FROM Todo t")
  Page<Todo> findAllByOrderByModifiedAtDesc(Pageable pageable);