Skip to content

Querydsl 사용 시 Pageable 내장 sorting이 적용 안되는 문제.

F i n n edited this page Dec 12, 2022 · 1 revision

1. 도입 이유 & 문제상황

Data JPA에 내장되어있는 Pageable의 Sort기능의 경우, Querydsl에서 단순히 사용할 경우, offset이나 limit와 다르게 전혀 작동하지가 않는다.

2. 해결 방안

-1. Pageable을 사용하지 않고, Querydsl 메소드에 자체적으로 sorting 기능을 구현
-2. 우리 서비스에서 정렬기능은 크게 복잡한 동적 정렬은 아니므로 data JPA라이브러리의 Pageable 정렬을 쓸 수 있도록 코드를 추가적으로 작성

3. 의견 결정

2번의 방법이 가능하다면 가장 효율적이기에(Pageable의 Query parameter 형태를 그대로 쓸 수 있다는 장점) 결정하게 되었다. 해결 방법은 우선 sort 기능을 빼놓은 query문을 작성 한 이후, fetch하지 않고, 그 아래에 sorting을 해주는 코드를 작성 후 fetch하는 형태로 해결 하였다.

// sorting
        for (Sort.Order o : pageable.getSort()) {
            PathBuilder pathBuilder = new PathBuilder(post.getType(), post.getMetadata());
            query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,
                    pathBuilder.get(o.getProperty())));
        }

4. 결과 반영

api호출할때, Query파라미터가( 정렬,검색,페이지사이즈, 페이지번호 까지) 잘 작동 하는 것을 확인 하였다.

구동확인이미지 추가 해주세요