개요
- 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 방법