如何使用 Spring JPA 进行分页 QueryDSL 查询?
-
12-12-2019 - |
题
QueryDSL 定义了一个 OrderSpecifier
通过调用可以轻松获得任何字段的接口和实例 asc()
或者 desc()
. 。这 QueryDslPredicateExecutor
Spring Data JPA 的接口甚至有一个 findAll()
方法采用 OrderSpecifier
s 作为参数。
org.springframework.data.domain.PageRequest
但是对 QueryDSL 一无所知,它有自己的定义查询排序顺序的方法,即 org.springframework.data.domain.Sort
. 。它可以包含多个 org.springframework.data.domain.Sort.Order
很像 OrderSpecifier
s,除了它们不是类型安全的等等。
那么,如果我想进行使用排序的分页查询,真的没有办法使用 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);