Dev/JPA

JPA 쿼리메소드 정렬

OK-가자 2022. 3. 2. 17:23

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