Java 带排序的Spring JPA规范

Java 带排序的Spring JPA规范,java,spring,sorting,spring-data-jpa,jpa-criteria,Java,Spring,Sorting,Spring Data Jpa,Jpa Criteria,我正在使用SpringJPA 更准确地说,我使用的存储库扩展了JpaRepository和JpaSpecificationExecutor,因为我需要分页、筛选和排序 现在,我的分页和过滤都工作得很好,但我无法让排序也工作 我有些失望地注意到JpaSpecificationExecutor有findAll()方法: findAll(Specification, Pageable); findAll(Specification, Sort); 但我需要的是: findAll(Specificat

我正在使用SpringJPA

更准确地说,我使用的存储库扩展了
JpaRepository
JpaSpecificationExecutor
,因为我需要分页、筛选和排序

现在,我的分页和过滤都工作得很好,但我无法让排序也工作

我有些失望地注意到
JpaSpecificationExecutor
findAll()
方法:

findAll(Specification, Pageable);
findAll(Specification, Sort);
但我需要的是:

findAll(Specification, Pageable, Sort); //or something like this
不存在

因此,计划B,在规范中包括排序

在这个问题的公认答案的帮助下:我总结了以下内容:

private Specification<MainEntity> matches() {
    return new Specification<MainEntity>() {

        public Predicate toPredicate(Root<MainEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

            List<Predicate> predicates = new ArrayList<Predicate>();

            //Attempt to sort by Surname, has no effect
            query.orderBy(cb.asc(root.get("surname")));

            //add string filters
            for (String field : stringFilterMap.keySet()) {
                String valuePattern = stringFilterMap.get(field);
                predicates.add(cb.like(root.get(field), "%"+valuePattern+"%"));
            }

            //...snip...

            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        }
    };      
}
专用规范匹配(){
返回新规范(){
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder cb){
列表谓词=新的ArrayList();
//尝试按姓氏排序,无效
query.orderBy(cb.asc(root.get(“姓氏”));
//添加字符串过滤器
for(字符串字段:stringFilterMap.keySet()){
String valuePattern=stringFilterMap.get(字段);
add(cb.like(root.get(field),“%”+valuePattern+“%”);
}
//…剪断。。。
返回cb.and(predicates.toArray(新谓词[predicates.size()]);
}
};      
}
其中,
springFilterMap
是一个实例字段,
Map
的键是字段名,值是过滤器值

上面你会看到我试图按姓氏排序,但这似乎没有效果

我做错了什么;&如何在分页和筛选的同时实现排序?

使用,这是的一个实现,可以根据需要同时实现分页和排序。例如,通过:

更新: 由于Spring Data JPA 2.0,上述构造函数已被弃用,您应使用静态工厂方法:


您介意使用SpringQueryDSL吗。您不需要编写任何排序代码。跟着春天的医生走,否则我可以给你一些指示。我使用过它,它避免了显式的额外编码。您只需传入参数和asc/desc,它将为您提供在查找类似问题时遇到的相应结果。我在控制器中使用存储库,当使用控制器时,您可以在方法签名中使用
@PageableDefault(size=10,sort=“sortColumn”,direction=sort.direction.DESC)Pageable Pageable
,以获得自动填充的Pageable对象(例如,就像@PathVariable)。
public PageRequest(int page, int size, Sort sort)
public static PageRequest of(int page, int size, Sort sort)