QueryMethod를 통한 Sort Paging
🤔 왼쪽에서 첫번째, 오른쪽에서 첫번째, 앞에서 첫번째, 뒤에서 첫번째,,,,
여러게 중에 하나는 순서에 따라 다른다.
👉 지난번에 했던 findLastByName 같은건 order by를 하고 첫번째를 선택해야한다고 했다.
그렇듯 Sort는 중요하다.
✅ SORT 실습
// findLastByName을 만들기 (역순으로 정렬후 가장 위에 값) (Asc는 정순, Desc는 역순)
List<User> findTopByNameOrderByIdDesc(String name);
// findLastByName (Id역순으로 이메일 정순으호하여 첫번째 데이터)
List<User> findFirstByNameOrderByIdDescEmailAsc(String name);
// 파라미터 기반
// 이름 조건으로 찾은 첫번째 데이터를 'sort'로 정렬 ex : (name: "martin",Sort.by(Order.desc("id))
// 코드 가독성을 위해 sort인자를 파라미터로 주면 좋다.
// 하지만 코드가 많이 중복될수 있다. 적절하게 사용하는게 중요하다.
// 인터페이스에서는 함수하나 선언해주고 사용하는 곳에서 원하는 sort를 쓰면 된다.
List<User> findFirstByName(String name, Sort sort);
/* 보통 많은 수의 데이터를 List 형식으로 받아온다. 그래서 패이징 처리가 필수 인데, Jpa에서는 아주 쉽게 페이징을 지원해준다.
* 중요한건 2가지
* 1. Page<User> 타입 = Page인터페이스 확인해보면 Slice(데이터의 일부 묶음)을 상속받아서 제공한다. ex) getContent()
* 1-1. Page 인터페이스에 Slice 에서 제공받은 함수 이외에도 getTotalElement() 같은 전체 레코드에 관한 기능도 제공한다.
* 2. Pageable 인터페이스 = 파라미터로 사용하는 pageable은 Pageable에 대한 요청값 이다.
* 2-1. pageable 파라미터가 요청 값 이면 Page는 응답 타입 이다.
* */
Page<User> findByName(String name, Pageable pageable);
✅ SORT 실습 TEST
System.out.println("findTopByNameOrderByIdDesc : " + userRepository.findTopByNameOrderByIdDesc("martin"));
System.out.println("findFirstByNameOrderByIdDescEmailAsc : " + userRepository.findFirstByNameOrderByIdDescEmailAsc("martin"));
System.out.println("findFirstByNameWithSortParams : " + userRepository.findFirstByName("martin", orderByIdDescEmailAsc()));
System.out.println("findFirstByNameWithSortParams : " + userRepository.findFirstByName("martin", Sort.by(Sort.Order.desc("id"), Sort.Order.asc("email"))));
System.out.println("findFirstByNameWithSortParams : " + userRepository.findFirstByName("martin", Sort.by(Sort.Order.desc("id"), Sort.Order.asc("email"))));
✅ SORT TEST 결과
👉 그럼 Pageing에 대해서도 실습해 보자.
✅ Pageing 실습
/* 보통 많은 수의 데이터를 List 형식으로 받아온다. 그래서 패이징 처리가 필수 인데, Jpa에서는 아주 쉽게 페이징을 지원해준다.
* 중요한건 2가지
* 1. Page<User> 타입 = Page인터페이스 확인해보면 Slice(데이터의 일부 묶음)을 상속받아서 제공한다. ex) getContent()
* 1-1. Page 인터페이스에 Slice 에서 제공받은 함수 이외에도 getTotalElement() 같은 전체 레코드에 관한 기능도 제공한다.
* 2. Pageable 인터페이스 = 파라미터로 사용하는 pageable은 Pageable에 대한 요청값 이다.
* 2-1. pageable 파라미터가 요청 값 이면 Page는 응답 타입 이다.
* */
Page<User> findByName(String name, Pageable pageable);
✅ Pageing 실습 TEST
System.out.println("findByNameWithPaging : " + userRepository.findByName("martin", PageRequest.of(0, 1, Sort.by(Sort.Order.desc("id")))).getTotalElements());
'Dev > JPA' 카테고리의 다른 글
JPA EntityListener (0) | 2022.03.02 |
---|---|
JPA Entity의 기본속성 (0) | 2022.03.02 |
JPA 쿼리메소드(QueryMethod) (0) | 2022.03.02 |
JPA Repository Interface 상세 2 (0) | 2022.03.02 |
JPA Repository Interface 상세 1 (0) | 2022.03.02 |