HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
[팀 BackFro💯] ArtZip: 세상 모든 전시회를 한 번에
[팀 BackFro💯] ArtZip: 세상 모든 전시회를 한 번에
/
☠️
백엔드 기술 문서
/
🤮
QueryDsl 에서 Pageable sort 옵션 적용하기
🤮

QueryDsl 에서 Pageable sort 옵션 적용하기

개요

  • Query Dsl은 order 메소드에 정렬 속성을 OrderSpecifier 의 Array 형태로 넣어준다.
  • Data Jpa처럼 Pabeable의 sort 속성을 기준으로 정렬해주는 기능은 없는 것 같다.
  • sorting 기준을 유저가 query parameter를 이용해 직접 선택할 수 있게 해주고 싶다! → Query Dsl에서도 Pageable의 sort 속성을 이용하고 싶다!

구현

QueryDslUtil.java

package com.prgrms.artzip.common.util; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.Order; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.Path; public class QueryDslUtil { public static OrderSpecifier<?> getSortedColumn(Order order, Path<?> parent, String fieldName) { Path<Object> fieldPath = Expressions.path(Object.class, parent, fieldName); return new OrderSpecifier(order, fieldPath); } }
  • Pageable에서 뽑아온 sort 옵션들을 OrderSpecifier 타입으로 변경시켜주는 녀석이다.
  • fieldName은 column명이 아닌 field이름을 넣어줘야 한다.

CustomRepositoryImpl 내

private List<OrderSpecifier> getAllOrderSpecifiers(Pageable pageable) { List<OrderSpecifier> orders = new ArrayList<>(); for (Sort.Order order : pageable.getSort()) { Order direction = order.getDirection().isAscending() ? Order.ASC : Order.DESC; switch (order.getProperty()) { case "created_at": OrderSpecifier<?> orderCreatedAt = QueryDslUtil.getSortedColumn(direction, exhibition.createdAt, "createdAt"); orders.add(orderCreatedAt); break; case "exhibition_id": OrderSpecifier<?> orderId = QueryDslUtil.getSortedColumn(direction, exhibition.id, "id"); orders.add(orderId); default: break; } } return orders; }
  • pageable의 sort 옵션들을 순회하며 최종적으로 List<OrderSpecifier 타입을 뱉어준다.
.orderBy(orders.toArray(OrderSpecifier[]::new))
  • 다음과 같은 식으로 OrderSpecifier의 Array 형태로 order 메소드에 넣어줄 수 있다.

Reference

[JPA] QueryDsl에서 Pageable 객체를 이용한 Sort 방법
우선 Order, Path, fieldName을 전달하면 OrderSpecifier 객체를 리턴하는 Util 클래스를 작성해서 Sort시 마다 사용할 수 있도록 한다. Path 파라미터는 compileQuerydsl 빌드를 통해서 생성된 Q타입 클래스의 객체이다. Sort의 대상이 되는 Q타입 클래스 객체를 전달한다.
[JPA] QueryDsl에서 Pageable 객체를 이용한 Sort 방법
https://uchupura.tistory.com/7