[QueryDSL] 정렬 & 페이징
2022. 8. 27. 21:50ㆍLanguage`/JPA
정렬
QueryDSL에서의 정렬은 "orderBy()"메소드를 통해서 내부적으로 정렬 기준의 필드에 대해서 [asc(), desc()]를 통해서 정렬하면 된다
// 25살 이상 Member들에 대한 "나이 오름차순/이름 내림차순 정렬"
List<Member> fetch = query.selectFrom(member)
.where(member.age.goe(25))
.orderBy(member.age.asc(), member.username.desc())
.fetch();
페이징
페이징은 "offset() & limit()"를 통해서 시작 지점/페이징 개수를 적절하게 조합해서 활용하면 된다
offset번째부터 limit개수의 페이징 처리를 한다는 의미이다
- QueryDSL에서 offset의 가장 처음 기준은 "0"이다
Pageable pageable = PageRequest.of(2, 20);
List<Member> fetch1 = query.selectFrom(member)
.where(member.age.goe(25))
.offset(0) // 시작 지점 (offset)
.limit(7) // 페이징 개수 (limit)
.fetch();
List<Member> fetch2 = query.selectFrom(member)
.where(member.age.goe(25))
.offset((long) pageable.getPageNumber() * pageable.getPageSize()) // 시작 지점 (offset)
.limit(pageable.getPageSize()) // 페이징 개수 (limit)
.fetch();
실제로 페이징 처리를 하기 위해서는 "전체 데이터 수"를 반드시 파악해야 한다.
이때는 단순하게 fetch()로 페이징 리스트를 받는게 아니라 "fetchResults()"로 페이징 리스트 + 전체 데이터 개수까지 받아야 한다
하지만 QueryDSL 5.0부터 fetchResults()/fetchCount()는 Deprecated되었다
왜냐하면 QueryDSL을 쓴다고해도 모든 Dialect에서 QueryResults로 count query를 정확하게 날릴 수 없고 group by/having과 같은 절을 함께 사용한다면 count query가 제대로 나가지 않는다고 한다
>> 따라서 fetch()로 List를 끌고온 다음에 size()를 통해서 각 페이징 개수를 확인하거나, 아니면 전체 데이터 개수 조회용 count query를 따로 만들어서 사용해야 한다
Pageable pageable = PageRequest.of(2, 20);
List<Member> fetch1 = query.selectFrom(member)
.where(member.age.goe(25))
.offset(0) // 시작 지점 (offset)
.limit(7) // 페이징 개수 (limit)
.fetch();
List<Member> fetch2 = query.selectFrom(member)
.where(member.age.goe(25))
.offset((long) pageable.getPageNumber() * pageable.getPageSize()) // 시작 지점 (offset)
.limit(pageable.getPageSize()) // 페이징 개수 (limit)
.fetch();
// 전체 데이터 count query
long memberCount = query.selectFrom(member)
.where(member.age.goe(25))
.stream().count();
// 각 페이징 개수 count
int fetch1Size = fetch1.size();
int fetch2Size = fetch2.size();
System.out.println("전체 데이터 개수 = " + memberCount);
System.out.println("fetch1 페이징 데이터 개수 = " + fetch1Size);
System.out.println("fetch2 페이징 데이터 개수 = " + fetch2Size);