7

QueryDSL 定义了一个接口和一个实例,可以通过调用或OrderSpecifier轻松获得任何字段的接口和实例。Spring Data JPA的接口甚至还有一个以s 为参数的方法。asc()desc()QueryDslPredicateExecutorfindAll()OrderSpecifier

org.springframework.data.domain.PageRequest然而,对 QueryDSL 一无所知,它有自己的方式来定义查询排序顺序,即org.springframework.data.domain.Sort. 它可以包含许多与org.springframework.data.domain.Sort.Orders 非常相似OrderSpecifier的 s,只是它们不是类型安全的等。

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

4

4 回答 4

9

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

于 2015-04-23T15:58:08.163 回答
7

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

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

然后你可以PageRequest像这样使用它:

new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))
于 2016-04-15T17:24:02.843 回答
6

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

private Sort sortBy(Path<?> path) {
    return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}
于 2012-07-27T14:57:43.067 回答
1

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);
于 2015-01-13T14:21:55.000 回答