-페이징, 정렬 파라미터
정렬 기능: org.springframework.data.domain.Sort
페이징 기능(내부에 sort를 포함): org.springframework.data.domain.Pageable
-특별한 반환 타입(Page,Slice,List)
Page: 추가 count 쿼리를 포함하는 페이징이다. 쿼리에 limit을 하기 위한 것이고, count는 반환 타입에서 결정된다
Slice: 추가 count 쿼리 없이 다음 페이지만 확인가능(내부적으로 Limit+1 을 조회한다)
주로 모바일에서 더보기 기능에 사용하고, totalCount를 계산함으로써 성능이 저하돼서 필요없을 때 사용한다
List(자바 컬렉션): 추가 count 쿼리 없이 결과만 반환한다
참고:
Pageable은 인터페이스이고, 페이지에서 나온 파라미터 정보를 포함한다
Page는 인터페이스이고, 결과 정보를 포함한다
Page<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용
Slice<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안함
List<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안함
List<Member> findByUsername(String name, Sort sort);
pageable에 offset과 limit이 있어서 이를 기준으로 페이징을 진행한다.
Pageable은 인터페이스라서 이를 구현한 객체인 PageRequest를 이용한다. 참고로 pagerequest에 담는 정보에 정렬정보도 추가할 수 있으며, 페이지 기본 시작은 0페이지에서부터 시작한다. 1페이지부터 시작이 아니다.
작성 방법은 다음과 같다
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC,"username"));
Page<Member> page = memberRepository.findByAge(10, pageRequest)
List<Member> content = page.getContent(); //조회된 데이터
assertThat(content.size()).isEqualTo(3); //조회된 데이터 수, content가 list라서 size만 사용할 수 있다
//page는 slice를 상속받기때문에 다음과 같은 기능을 사용할 수 있다
assertThat(page.getTotalElements()).isEqualTo(5); //전체 데이터 수
assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
assertThat(page.getTotalPages()).isEqualTo(2); //전체 페이지 번호
assertThat(page.isFirst()).isTrue(); //첫번째 항목인가?
assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는가?
-Page 인터페이스
public interface Page<T> extends Slice<T> {
int getTotalPages(); //전체 페이지 수
long getTotalElements(); //전체 데이터 수
<U> Page<U> map(Function<? super T, ? extends U> converter); //변환기
}
-Slice 인터페이스
public interface Slice<T> extends Streamable<T> {
int getNumber();
int getSize();
int getNumberOfElements();
List<T> getContent();
boolean hasContent();
Sort getSort();
boolean isFirst();
boolean isLast();
boolean hasNext();
boolean hasPrevious();
Pageable getPageable();
Pageable nextPageable();
Pageable previousPageable();//이전 페이지 객체
<U> Slice<U> map(Function<? super T, ? extends U> converter); //변환기
}
-count쿼리를 다음과 같이 분리할 수 있다. 복잡한 sql에서 사용해야하며, 데이터는 Left join을 하고, 카운트는 Left join 안 해도 된다. 참고로 전체 count 쿼리는 매우 무겁다
@Query(value = “select m from Member m”,
countQuery = “select count(m.username) from Member m”)
Page<Member> findMemberAllCountBy(Pageable pageable);
'Spring > Spring Data JPA' 카테고리의 다른 글
[스프링 데이터 JPA] Auditing (0) | 2022.03.20 |
---|---|
[스프링 데이터 JPA] @EntityGraph (0) | 2022.03.20 |
[스프링 데이터 JPA] 벌크 연산, 스냅샷 (0) | 2022.03.19 |
[스프링 데이터 JPA] 파라미터 바인딩, 반환 타입 (0) | 2022.03.19 |
[스프링 데이터 JPA] 공통메서드와 쿼리 메소드 3가지, @NamedQuery, @Query (0) | 2022.03.19 |