我正在使用Spring JPA。
更准确地说,我正在使用一个扩展了JpaRepository
和JpaSpecificationExecutor
的Repository,因为我需要分页、过滤和排序。
现在我的分页和过滤都很好地实现了,但是我无法让排序也起作用。
我注意到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()]));
}
};
}
springFilterMap
是一个实例字段,它是一个 Map<String,String>
,其中键是字段名称,值是过滤器值。
上面是我尝试按姓氏排序的代码,但好像没有效果。
我做错了什么;如何实现排序、分页和筛选?
@PageableDefault(size = 10, sort = "sortColumn", direction = Sort.Direction.DESC) Pageable pageable
来获取自动填充的Pageable对象(就像@PathVariable一样)。 - evandongen