在 querydsl 的 orderBy 子句中使用列名

Using column names in orderBy clause in querydsl

我想知道是否有办法在 querydsl JPA 的 orderBy 子句中使用列名。我想根据来自外部输入的列名构建多个 orderBy 条件。

假设我有实体 Person 和要排序的列名称。我想做类似下面代码的事情。

List<String> sortingColumns = ...; // comes from external.
QPerson person = QPerson.person;
JPAQuery<Person> query = jpaQueryFactory.select(person).from(person);
for (String column : sortingColumns) {
    // Is there something like person.getPath(column) in querydsl?
    query = query.orderBy(person.getPath(column).asc());
}

谢谢。

尝试使用ExpressionUtils.path

您必须知道列类型才能使用它。所以你需要这样的东西 Map<String, Class<?>> propertyTypeMap = new LinkedHashMap<>() 而不是 List<String> sortingColumns = ...

List<OrderSpecifier> orderBy = new LinkedList<>();

for (Entry<String, Class<?>> entry: propertyTypeMap.entrySet()) {
    String property = entry.getKey();
    Class<?> type = entry.getValue();
    
    orderBy.add(ExpressionUtils.path(type, person, property).asc()); 
}

query.orderBy(orderBy.toArray());