728x90
JOIN을 해서 pagination까지 제공해야하는 경우가 있습니다.
@Repository
public interface MemberJpaRepository extends JpaRepository<Member, Long> {
@Query(value = "select m from Member m left join m.team t where t.id = :teamId")
Page<Member> findPageByName(String name, Pageable pageable);
}
그런데 이 때 JOIN을 사용하는 COUNT 쿼리가 발생할 수 있습니다.
select count(m) from Member m left join m.team t
left outer join은 COUNT 결과 갯수에 영향을 주지 않음에도, 이미 충분히 무거운 count 쿼리의 성능을 저하시킬 수 있습니다.
이럴 때에는 데이터 조회 query와 Count 조회 query를 분리하는 방법을 사용해야합니다.
spring-data-jpa에서는 @Query에서 countQuery를 별도로 지정할 수 있는 방법을 제공합니다.
@Repository
public interface MemberJpaRepository extends JpaRepository<Member, Long> {
@Query(value = "select m from Member m left join m.team t where t.id = :teamId",
countQuery = "select count(m) from Member m")
Page<Member> findPageByName(String name, Pageable pageable);
}
728x90
'DEV > Spring Data JPA' 카테고리의 다른 글
Update 쿼리를 호출할 때 주의사항 2가지 (0) | 2023.09.24 |
---|---|
Page<Entity>를 API의 응답으로 리턴하는 방법 (0) | 2023.09.24 |
COUNT 쿼리, Page<T> vs Slice<T> (0) | 2023.09.24 |
데이터 조회의 반환값 T vs Optional<T> (0) | 2023.09.24 |
메서드 이름으로 데이터 조회하기 vs JPQL 직접 작성해서 데이터 조회하기 (0) | 2023.09.24 |