JPA/Paging
JPA, JPQL paging
by BAYABA
2021. 9. 24.
- 개인 공부 목적으로 작성한 포스팅입니다.
- 아래 출처를 참고하여 작성하였습니다.
1. 사용 방법
- PagingAndSortingRepository의 findAll 메서드 parameter에 PageRequest를 넣어주면 됩니다.
- PageRequest는 Pageable의 구현체입니다.
- PageRequest는 정적 팩토리 메서드로 생성해야 합니다. (of 메서드)
- 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
- JPA paging에서 실제 페이징을 위한 처리는 ServiceLayer에서 할 수 있습니다.
- 즉, Repository 메소드를 호출하는 쪽에서 페이징 처리를 해줘야한다는 의미입니다.
- 반환은 List로 하기위해 getContent를 사용합니다.
- 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
- 아래와 같이 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);
//...
- 그러면 아래와 같이 쿼리가 나가는 것을 볼 수 있습니다.
- page = 0이라면, limit ?
- page != 0이라면, limit ?, ?
where
quizstate0_.user_seq=?
and quizstatet2_.desc='NOT_SELECTED' limit ?, ?
출처
- JPA Paging (페이지 나누기)
- [JPA] JPA 시작하기(6) - page
- What is the LIMIT clause alternative in JPQL?
- Limiting Query Results with JPA and Spring Data JPA