Spring 带排序的 JPA 规范
Spring JPA Specification with Sort
我正在使用 Spring JPA。
更准确地说,我正在使用扩展 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()]));
}
};
}
其中springFilterMap
为实例字段,Map<String,String>
其键为字段名,值为过滤值
上面你会看到我尝试按姓氏排序,但这似乎没有效果。
我做错了什么; &如何实现排序以及分页和过滤?
使用PageRequest, which is an implementation of Pageable, and implements paging and sorting at once, like you want it. For example through this constructor:
public PageRequest(int page, int size, Sort sort)
更新:
由于 Spring Data JPA 2.0 上述构造函数已弃用,您应该使用静态工厂方法 of:
public static PageRequest of(int page, int size, Sort sort)
我正在使用 Spring JPA。
更准确地说,我正在使用扩展 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()]));
}
};
}
其中springFilterMap
为实例字段,Map<String,String>
其键为字段名,值为过滤值
上面你会看到我尝试按姓氏排序,但这似乎没有效果。
我做错了什么; &如何实现排序以及分页和过滤?
使用PageRequest, which is an implementation of Pageable, and implements paging and sorting at once, like you want it. For example through this constructor:
public PageRequest(int page, int size, Sort sort)
更新: 由于 Spring Data JPA 2.0 上述构造函数已弃用,您应该使用静态工厂方法 of:
public static PageRequest of(int page, int size, Sort sort)