QueryDSL定义了OrderSpecifier
接口,通过调用asc()
或desc()
可以轻松获取任何字段的实例。 Spring Data JPA的QueryDslPredicateExecutor
接口甚至有一个findAll()
方法,它将OrderSpecifier
作为参数。
org.springframework.data.domain.PageRequest
对QueryDSL一无所知,它有自己的方式来定义查询排序顺序,即org.springframework.data.domain.Sort
。它可以包含许多org.springframework.data.domain.Sort.Order
s,它们与OrderSpecifier
很相似,只是它们不是类型安全的等等。
所以,如果我想制作使用排序的分页查询,是否真的没有办法使用QueryDSL来定义它?
答案 0 :(得分:7)
我知道它已经有一段时间了,我不确定这在OP时是否可用但是现在有一个QPageRequest对象引入了允许通过QueryDSL进行排序以添加到spring数据jpa Query DSL ...
答案 1 :(得分:5)
这是使用QueryDSL构建Sort
对象的一种更简单的方法:
new QSort(user.manager.firstname.asc())
然后你可以像PageRequest
那样使用它:
new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))
答案 2 :(得分: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);