본문 바로가기
Programming/JPA & Spring Data JPA 기초

23. 정렬, 페이징, @Query

by JKROH 2023. 4. 10.
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* 정렬 1

  • find 메서드에 OrderBy를 붙인다.
    • OrderBy 뒤에 프로퍼티 명을 붙이고 Asc / Desc를 붙인다.
    • 여러 프로퍼티의 지정이 가능하다.
List<User> findByNameLikeOrderByNameDesc(String keyword);
-> order by u.name desc

List<User> findByNameLikeOrderByNameAsc(String keyword);
-> order by u.name asc

List<User> findByNameLikeOrderByNameAscEmailDesc(String keyword);
-> order by u.name asc, email desc

 

* 정렬 2

  • Sort 타입을 사용할 수 있다.
List<User> findByNameLike(String keyword, Sort sort);


Sort sort1 = Sort.by(Sort.Order.asc("name"));
List<User> users1 = userRepository.findByNameLike("이름%", sort1);
-> order by u.name asc

Sort sort2 = Sort.by(Sort.Order.asc("name"), Sort.Order.desc("email"));
List<User> users2 = userRepository.findByNameLike("이름%", sort2);
-> order by u.name asc, email desc

 

* 페이징

  • Paegable / PageRequest를 사용한다.
    • Pageable 은 interface다.
    • PageRequest는 Pageable의 구현체다.
List<User> findByNameLike(String keyword, Pageable pageable);


// page는 0부터 시작한다.
Pageable pageable = PageRequest.ofSize(10). withPage(1) // 한 페이지에 10개씩을 기준으로 두 번째 페이지를 조회한다.
List<User> users1 = userRepository.findByNameList("이름%", pageable);

Sort sort = Sort.by(Sort.Order.asc("name"), Sort.Order.desc("email"));
Pageable pageable = PageRequest.ofSize(10). withPage(1).withSort(sort);
List<User> users2 = userRepository.findByNameList("이름%", pageable);

 

* 페이징 조회 결과 Page로 구하기

  • Page 타입 : 페이징 처리에 필요한 값(전체 페이지 갯수, 전체 갯수)등을 함께 제공하면 반환받을 수 있다.
  • Pageable을 사용하는 메서드의 리턴 타입을 Page로 지정하면 된다.
Page<User> findByEmailList(String keyword, Pageable pageable);

Pageable pageable = PageRequest.ofSize(10).withPage(0).withSort(sort);
Page<User> page = userRepository.findByEmailLike("email%"), pageable);

long totalElements = page.getTotalElements(); // 조건에 해당하는 전체 엔티티 갯수
int totalPages = page.getTotalPages(); // 전체 페이지 갯수
List<User> content = page.getContent(); // 현재 페이지 결과 목록
int size = page.getSize(); // 페이지 크기
int pageNumber = page.getNumber(); // 현재 페이지
int numberOfElements = page.getNumberOfElements(); // content의 갯수

 

* @Query

  • 메서드 명명 규칙이 아닌 JPQL을 직접 사용할 때 사용한다.
    • 메서드에 이름을 길게 늘어뜨리지 않고 메서드 이름을 간결하게 사용할 수 있다.
@Query("select u from user u where u.create > :since order by u.createDate desc")
List<User> findRecentUsers(@Param("since") LocalDateTime since);

@Query("select u from user u where u.create > :since")
List<User> findRecentUsers(@Param("since") LocalDateTime since, Sort sort);

@Query("select u from user u where u.create > :since")
Page<User> findRecentUsers(@Param("since") LocalDateTime since, Pageable pageable);
  • since와 같이 이름을 가진 parameter는 @Param 애너테이션을 이용해서 값을 정해주면 된다.

 

* 정리

  • 메서드 명으로 정렬을 지정할 순 있지만 정렬할 요인이 많아지는 등의 경우가 있기 때문에 가능하면 Sort를 사용한다.
  • Pageable / PageRequest로 페이징 처리가 가능하다.
    • Pageable 대신 findTop / findFirst, findTopN / findFirstN 등을 사용해도 상위 첫 번째, 상위 N개만 구하는 것이 가능하다.
  • @Query를 사용해서 JPQL을 지정할 수 있다.
반응형

댓글