簡體   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