QueryDSL 中的动态排序

问题描述 投票:0回答:2

假设我有一个实体:

@Entity
public class Person {
    @Id
    private int id;
    private String name;
    private Date birthdate;
}

并且我想要有一种方法,该方法将基于

OrderSpecifier
参数返回该实体的字段
String
,该参数将是实体字段之一的名称。

/**
 * fieldName - name of field from Person entity
 */
private OrderSpecifier<?> getSortedColumn(Order order, String fieldName){
    //how to implement this???        
}
jpa querydsl
2个回答
13
投票

我实际上设法这样做了:

/**
 * fieldName - name of field from Person entity
 */
private OrderSpecifier<?> getSortedColumn(Order order, String fieldName){
    Path<Object> fieldPath = Expressions.path(Object.class, QPerson.person, fieldName);     
    return new OrderSpecifier(order, fieldPath);
}

0
投票

这是使用字段路径的另一种方法,它适用于任何 Q 类型

    public static OrderSpecifier<?> getSortColumn(EntityPathBase<?> entity, Order order, String fieldName) {

        final var entityPath = new PathBuilder<>(entity.getType(), entity.getMetadata().getName());
        final var sortColumnPath = entityPath.getComparable(fieldName, Comparable.class); //All sorting columns should be implementing Comparable

        return switch (order) {
            case ASC -> sortColumnPath.asc();
            case DESC -> sortColumnPath.desc();
        };
    }

我正在使用一些 Java 17+ 功能,但您仍然可以不使用。
这应该适用于任何 Q 类型,即

getSortColumn(QPerson.person, "name");
getSortColumn(QDog.dog, "dateOfBirth");

并且您不必手动构造

OrderSpecifier
的新实例并处理“使用原始类型”警告。

© www.soinside.com 2019 - 2024. All rights reserved.