Spring/Spring Data JPA

[Spring Data JPA] 3-1. Defining Query Methods (3)

noahkim_ 2024. 8. 2. 13:31

7. Paging, Iterating Large Results, Sorting & Limiting

  • 대규모 데이터 세트를 효율적으로 조회 및 처리
Concept Description Usage
Paging 페이징 정보 전달
Pageable 매개변수 사용 (페이지 번호, 정렬 기준, 조회 결과 수)
Page<T>와 Slice<T> 반환 타입 사용
Sorting 정렬 기준을 전달하는 매개변수
Sort 매개변수 사용
- 정렬 기준 설정 가능 (ascending(), descending())
Limiting 조회 결과 수를 제한하는 방법
Top, First 키워드, Limit 매개변수 사용

 

예제) Paging

더보기
Page<User> findByLastname(String lastname, Pageable pageable);
Slice<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Pageable pageable);
Pageable pageable = PageRequest.of(pageNumber, pageSize);
Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Order.asc("lastname")));



Concept Description Usage
Pageable 페이징 정보를 전달하는 매개변수
- 페이지 번호, 정렬 기준, 조회 결과 수
Page<T>와 함께 사용 ✅
Slice<T>와 함께 사용 ❌
Return Type
Slice<T>
- 페이지 크기 + 1개 (다음 슬라이스 존재 여부 확인 가능)
다음 슬라이스 존재 여부 확인 가능 (hasNext())
Page<T>
- 페이지 크기 + 전체 갯수 (전체 카운트 쿼리 실행)
전체 결과 수를 알 수 있음

 

 

예제) Sorting

더보기

Sort (new)

Sort sort = Sort.by("firstname").ascending().and(Sort.by("lastname").descending());
TypedSort<Person> person = Sort.sort(Person.class);
Sort sort = person.by(Person::getFirstname).ascending().and(person.by(Person::getLastname).descending());
QSort sort = QSort.by(QPerson.firstname.asc()).and(QSort.by(QPerson.lastname.desc()));
  • Sort: 여러 기준 결합 가능
  • Type-safe API: 타입 안전한 정렬 API
  • QSort (QueryDSL): QueryDSL을 통한 정렬 기준 설정

Sort (param)

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.lastname like ?1%")
  List<User> findByAndSort(String lastname, Sort sort);

  @Query("select u.id, LENGTH(u.firstname) as fn_len from User u where u.lastname like ?1%")
  List<Object[]> findByAsArrayAndSort(String lastname, Sort sort);
}

 

예제) Limiting

더보기

Limit (param)

List<User> findByLastname(Limit limit);

 

Top & First (keyword)

User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
Slice<User> findTop3ByLastname(String lastname, Pageable pageable);
List<User> findFirst10ByLastname(String lastname, Sort sort);
List<User> findTop10ByLastname(String lastname, Pageable pageable);