20

我正在使用 Spring JPA。

更准确地说,我使用的是一个扩展的存储库,JpaRepository因为JpaSpecificationExecutor我需要分页、过滤和排序。

现在我的分页和过滤都工作得很好,但我不能让排序也能正常工作。

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

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

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

在上面你会看到我尝试按姓氏订购,但这似乎没有效果。

我究竟做错了什么; 以及如何实现分页和过滤的排序?

4

1 回答 1

31

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

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

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

public static PageRequest of(int page, int size, Sort sort)
于 2017-03-26T15:13:40.263 回答