Spring JPA规范与排序

21

我正在使用Spring JPA。

更准确地说,我正在使用一个扩展了JpaRepositoryJpaSpecificationExecutor的Repository,因为我需要分页、过滤和排序。

现在我的分页和过滤都很好地实现了,但是我无法让排序也起作用。

我注意到JpaSpecificationExecutorfindAll()方法,感到有些失望:

findAll(Specification, Pageable);
findAll(Specification, Sort);

但是我需要的那一个:

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

不存在!

所以,计划B是在规范中包含排序。

在这个问题的被接受答案的帮助下:JpaSpecificationExecutor JOIN + ORDER BY in Specification,我整理出了以下内容:

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()]));
        }
    };      
}

springFilterMap 是一个实例字段,它是一个 Map<String,String>,其中键是字段名称,值是过滤器值。

上面是我尝试按姓氏排序的代码,但好像没有效果。

我做错了什么;如何实现排序、分页和筛选?


你介意使用Spring Query DSL吗?你不需要编写任何排序代码。按照Spring文档或者我可以给你一些指导。我已经使用过它,它避免了额外的显式编码。你只需传入你的参数和升序/降序,它会给你适当的结果。 - surya
1
当我在寻找类似问题时,遇到了你的问题。我在我的控制器中使用存储库,在使用控制器时,您可以在方法签名中使用@PageableDefault(size = 10, sort = "sortColumn", direction = Sort.Direction.DESC) Pageable pageable来获取自动填充的Pageable对象(就像@PathVariable一样)。 - evandongen
1个回答

32

使用PageRequest,它是Pageable的一个实现,可以同时实现分页和排序,就像你想要的那样。例如,通过这个构造函数

public PageRequest(int page, int size, Sort sort)

更新: 自Spring Data JPA 2.0开始,上述构造函数已被弃用,您应该使用静态工厂方法of:

public static PageRequest of(int page, int size, Sort sort)

这个排序是在页面内进行,还是先从存储库中对数据进行排序,然后再进行分页? - Nikolas
按照内部子实体的列进行排序,例如Entity1.Entity2.Entity3,无法正常工作。 - Thomson Ignesious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接