QueryDSL 定义了一个 OrderSpecifier 通过调用可以轻松获得任何字段的接口和实例 asc() 或者 desc(). 。这 QueryDslPredicateExecutor Spring Data JPA 的接口甚至有一个 findAll() 方法采用 OrderSpecifiers 作为参数。

org.springframework.data.domain.PageRequest 但是对 QueryDSL 一无所知,它有自己的定义查询排序顺序的方法,即 org.springframework.data.domain.Sort. 。它可以包含多个 org.springframework.data.domain.Sort.Order很像 OrderSpecifiers,除了它们不是类型安全的等等。

那么,如果我想进行使用排序的分页查询,真的没有办法使用 QueryDSL 来定义它吗?

有帮助吗?

解决方案

如果你找不到其他方法,它应该像这样工作

private Sort sortBy(Path<?> path) {
    return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}

其他提示

我知道已经有一段时间了,我不确定这在 OP 时是否可用,但现在有一个 QPageRequest 引入的对象允许通过 QueryDSL 进行排序添加到 spring data jpa Query DSL...

这是构建一个更简单的方法 Sort 使用 QueryDSL 的对象:

new QSort(user.manager.firstname.asc())

然后你可以在一个 PageRequest 像这样:

new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))

getExpression() 方法已被删除,我的表达式类似于 QPost.post.period.periCode 哪个 需要的 遍历,如果没有表达式的完整名称,我无能为力,所以现在我做了一个方法来收集 period.periCode 并且完美地工作在 QPost.post.

private String resolveOrderPath(Path<?> path) {
    StringBuilder stringBuffer = new StringBuilder(path.getMetadata().getName());
    path = path.getMetadata().getParent();
    while(!path.getMetadata().isRoot()) {
        stringBuffer.insert(0, path.getMetadata().getName() + ".");
        path = path.getMetadata().getParent();
    }
    return stringBuffer.toString();
}

Path<?> path = QPost.post.period.periCode;
String propertyPath = resolveOrderPath(path);
Sort sort = new Sort("asc".equals(sSortDir0) ? Sort.Direction.ASC : Sort.Direction.DESC, propertyPath);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top