본문 바로가기
JPA/Paging

JPA, JPQL paging

by BAYABA 2021. 9. 24.
  1. 개인 공부 목적으로 작성한 포스팅입니다.
  2. 아래 출처를 참고하여 작성하였습니다.

1. 사용 방법

  1. PagingAndSortingRepository의 findAll 메서드 parameter에 PageRequest를 넣어주면 됩니다.
  • PageRequest는 Pageable의 구현체입니다.
  • PageRequest는 정적 팩토리 메서드로 생성해야 합니다. (of 메서드)
  1. JpaRepository는 이미 PagingAndSortingRepository를 상속받았으므로 Repository에서는 별다른 작업이 필요하지 않습니다.
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {

    /**
     * Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
     *
     * @param pageable
     * @return a page of entities
     */
    Page<T> findAll(Pageable pageable);
}
@Repository
public interface FaqRepository extends JpaRepository<Faq, Long> {   

}

2. JPA paging

  1. JPA paging에서 실제 페이징을 위한 처리는 ServiceLayer에서 할 수 있습니다.
  • 즉, Repository 메소드를 호출하는 쪽에서 페이징 처리를 해줘야한다는 의미입니다.
  1. 반환은 List로 하기위해 getContent를 사용합니다.
  2. getContent를 사용하지 않으면 Page가 findAll(pageRequest)의 반환 타입입니다.
@Service
public class FaqService {

    //...

    /**
     * page = offset
     * size = limit
     */
    public List<Faq> findAll(final int offset, final int limit) {
        return faqRepository.findAll(PageRequest.of(offset, limit)).getContent();
    }
}

3. JPQL Paging

  1. 아래와 같이 JPQL @Query 구문에 parameter로 Pageable 인터페이스를 주면 됩니다.
  • 페이징 처리 때문에 @Query 쿼리가 바뀌진 않습니다.
//example1
//in @Repository code

@Query("select * from a_table order by a_table_column desc")
List<String> getStringValue(Pageable pageable);
//example2
import org.springframework.data.domain.Pageable;

@Repository
public interface QuizStateRepository extends JpaRepository<QuizState, Integer> {

    @Query(value = "SELECT qs FROM QuizState qs join fetch qs.quiz join fetch qs.quizStateType WHERE qs.user = ?1 and qs.quizStateType.desc = 'NOT_SELECTED'")
    List<QuizState> findAllNotSelectedProblems(User user, Pageable pageable);

    //...

  1. 그러면 아래와 같이 쿼리가 나가는 것을 볼 수 있습니다.
  • page = 0이라면, limit ?
  • page != 0이라면, limit ?, ?

where
        quizstate0_.user_seq=? 
        and quizstatet2_.desc='NOT_SELECTED' limit ?, ?

출처

  1. JPA Paging (페이지 나누기)
  2. [JPA] JPA 시작하기(6) - page
  3. What is the LIMIT clause alternative in JPQL?
  4. Limiting Query Results with JPA and Spring Data JPA