How
우선 정렬을 동적으로 처리하기 위해서는
OrderSpecifier
라는 객체가 필요하다.
내부로 들어
OrderSpecifier
객체를 보면 Order 객체 target 객체를 필수적으로 요하고 선택적으로 NullHandling에 관한 객체가 필요하다.
여기에서의 target은 querydsl의 Qclass에 관한 정보를 넘겨주면 된다.
- Qclass 경로 정보, Qclass의 필드이름
querydsl을 사용하면 Q Class들로 부터 쿼리를 생성하기 때문이다.
Utils 클래스를 만들어 dsl 사용하는 어디에서든 컬럼을 추출 할 수 있도록 구성한다.
import com.querydsl.core.types.Order; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.Expressions; 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안에 구성해놓은 정렬 순서를 orderSpecifier로 변환한다.
List<OrderSpecifier> getAllOrderSpecifiers(Pageable pageable) { List<OrderSpecifier> orders = new ArrayList<>(); if (!isEmpty(pageable.getSort())) { for (Sort.Order order : pageable.getSort()) { Order direction = order.getDirection().isAscending() ? Order.ASC : Order.DESC; switch (order.getProperty()) { case "id": OrderSpecifier<?> orderId = QueryDslUtil.getSortedColumn(direction, ${QclassName}, ${filedName}); orders.add(orderId); break; default: break; } } } return orders; }