JPA 의 페이징
JPA는 페이징을 두 API로 추상화 해두었다.
public List<Member> findByPage(int age,int offset,int limit){
return em.createQuery("select m from Member m where m.age = :age order by m.username desc",Member.class)
.setParameter("age",age)
.setFirstResult(offset)
.setMaxResults(limit)
.getResultList();
}
setFirstResult(int startPosition)
: 조회를 시작할 위치를 정한다.setMaxResults(int maxResult)
: 조회할 데이터 수를 정한다.Spring Data JPA의 페이징
Spring Data 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만큼 더 조회)List
: 자바컬렉션, 결과만을 반환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
은 인터페이스로 실제 사용 시에는 해당 인터페이스를 구현한 org.springframework.data.domain.PageRequest
를 사용한다.PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
Page<Member> page = memberRepository.findByAge(10, pageRequest);
PageRequest.of(int page,int size,Sort sort)
Page 인터페이스
// Page는 Slice를 상속 받고 있다.
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); //변환기
}