如何使用Spring JPA进行分页QueryDSL查询?

时间:2012-07-26 15:52:22

标签: spring spring-data-jpa querydsl

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来定义它?

3 个答案:

答案 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);