繁体   English   中英

带排序的Spring JPA规范

[英]Spring JPA Specification with Sort

我正在使用Spring JPA。

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

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

JpaSpecificationExecutor失望地注意到JpaSpecificationExecutorfindAll()方法:

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

但我需要的那个:

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

不存在!

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

在此问题的接受答案的帮助下: 规范中的JpaSpecificationExecutor JOIN + ORDER BY我将以下内容放在一起:

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>其键是字段名称和值是过滤器值。

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

我究竟做错了什么; 如何与分页和过滤一起实现排序?

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

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

更新:由于春季数据JPA 2.0以上的构造已被废弃,你应该使用静态工厂方法

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM