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

  • 대규모 데이터 세트를 효율적으로 조회 및 처리
Page<User> findByLastname(String lastname, Pageable pageable);
Slice<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
List<User> findByLastname(String lastname, Sort sort, Limit limit);
List<User> findByLastname(String lastname, Pageable pageable);

 

Paging

Pageable (param)
  • 페이징 정보 전달 (번호, 정렬 기준, 조회 결과 수)
  • Sort, Limit와 함께 사용 X

 

Return type
  • Slice<T>: 페이지 크기 + 1개 (다음 슬라이스 존재 여부 확인 O)
  • Page<T>: 페이지 크기 + 전체 갯수 (전체 카운트 쿼리 실행 O) 

 

Sorting

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);
}

 

Sort (new)
  • 여러 기준 결합 가능
Sort sort = Sort.by("firstname").ascending().and(Sort.by("lastname").descending());

 

  • type-safe API
TypedSort<Person> person = Sort.sort(Person.class);
Sort sort = person.by(Person::getFirstname).ascending().and(person.by(Person::getLastname).descending());

 

  • 메타모델 타입 (QueryDSL)
QSort sort = QSort.by(QPerson.firstname.asc()).and(QSort.by(QPerson.lastname.desc()));

 

API
  • field
repo.findByAndSort("lannister", Sort.by("firstname"));

 

  • alias
repo.findByAsArrayAndSort("bolton", Sort.by("fn_len"));

 

  • 함수 호출 포함 (JpaSort)
repo.findByAndSort("targaryen", JpaSort.unsafe("LENGTH(firstname)"));

 

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);

 

 


출처