假设我有一个实体:
@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???
}
我实际上设法这样做了:
/**
* 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);
}
这是使用字段路径的另一种方法,它适用于任何 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
的新实例并处理“使用原始类型”警告。