개요

구현

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);
  }

}

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;
  }
.orderBy(orders.toArray(OrderSpecifier[]::new))

Reference

[JPA] QueryDsl에서 Pageable 객체를 이용한 Sort 방법