728x90
- 스프링 데이터 JPA 페이징과 정렬
- 페이징과 정렬 파라미터
- org.springframework.data.domain.Sort : 정렬 기능
- org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함)
- 특별한 반환 타입
- org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징
- org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지만 확인 가능합니다(내부적으로 limit + 1조회함).
- 페이징과 정렬 파라미터
- Page 사용 예제 코드
- 검색 조건: 나이가 20살
- 정렬 조건: 이름으로 오름차순
- 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건
- Page 사용 예제 정의 코드
public interface MemberRepository extends Repository<Member, Long> {
Page<Member> findByAge(int age, Pageable pageable);
}
- Page 사용 예제 실행 코드
//페이징 조건과 정렬 조건 설정
@Test
public void page() throws Exception {
//given
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 20));
memberRepository.save(new Member("member3", 20));
memberRepository.save(new Member("member4", 20));
memberRepository.save(new Member("member5", 30));
//when
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.ASC,"username"));
Page<Member> page = memberRepository.findByAge(10, pageRequest);
//then
List<Member> content = page.getContent(); //조회된 데이터
assertThat(content.size()).isEqualTo(3); //조회된 데이터 수
assertThat(page.getTotalElements()).isEqualTo(5); //전체 데이터 수
assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
assertThat(page.getTotalPages()).isEqualTo(2); //전체 페이지 번호
assertThat(page.isFirst()).isTrue(); //첫번째 항목인지 여부?
assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는지 여부?
}
- 두 번째 파라미터로 받은 Pagable 은 인터페이스입니다. 따라서 실제 사용할 때는 해당 인터페이스를 구현한 org.springframework.data.domain.PageRequest 객체를 사용합니다.
- PageRequest 생성자의 첫 번째 파라미터에는 현재 페이지를, 두 번째 파라미터에는 조회할 데이터 수를 입력합니다. 여기에 추가로 정렬 정보도 파라미터로 사용할 수 있다. 참고로 페이지는 0부터 시작합니다(주의: Page는 1부터 시작이 아니라 0부터 시작입니다).
- Top, First 사용 참고(예제: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result )
- 위 링크의 스프링 데이터 JPA에 따르면 'find…by검색어' 에서 가운데 … 부분에 Top또는 First를 넣어서 정렬이 가능합니다.
User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable); //라스트 네임으로 처음 등록된 10명을 찾아서 반환해라
Slice<User> findTop3ByLastname(String lastname, Pageable pageable); //라스트 네임으로 처음 등록된 10명을 찾아서 반환해라
List<User> findFirst10ByLastname(String lastname, Sort sort); //라스트 네임으로 처음 등록된 10명을 찾아서 반환해라
List<User> findTop10ByLastname(String lastname, Pageable pageable);
728x90
'JPA' 카테고리의 다른 글
JPA에서 pageable을 통해 Paging 간단하게 구현하는 법 (0) | 2022.03.22 |
---|---|
(스프링 시큐리티)UserDetailsService, UserDetail (0) | 2022.02.17 |
(Spring data JPA) 쿼리 메소드란? (0) | 2022.02.15 |
스프링 데이터 JPA 란? (0) | 2022.02.15 |
QueryDSL 소개 (0) | 2022.02.15 |