-> 블로그 이전

[QueryDSL] 정렬 & 페이징

2022. 8. 27. 21:50Language`/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();

왼쪽 = 0번째부터 7개 (0 ~ 6) / 오른쪽 = 40번째부터 20개 (40 ~ 59)

 

실제로 페이징 처리를 하기 위해서는 "전체 데이터 수"를 반드시 파악해야 한다.

이때는 단순하게 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);

별도의 전체 데이터 Count Query