Nic*_*ckJ 13 java sorting spring spring-data-jpa jpa-criteria
我正在使用Spring JPA.
是我使用的延伸的信息库更精确的JpaRepository和JpaSpecificationExecutor因为我需要分页,过滤和排序.
现在我的分页和过滤都工作得很好,但我也无法进行排序.
我有些失望地注意到JpaSpecificationExecutor有findAll()方法:
findAll(Specification, Pageable);
findAll(Specification, Sort);
Run Code Online (Sandbox Code Playgroud)
但我需要的那个:
findAll(Specification, Pageable, Sort); //or something like this
Run Code Online (Sandbox Code Playgroud)
不存在!
因此,计划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()]));
}
};
}
Run Code Online (Sandbox Code Playgroud)
其中springFilterMap是一个实例字段,Map<String,String>其键是字段名称,值是过滤器值.
上面你会看到我尝试按姓氏命令,但这似乎没有效果.
我究竟做错了什么; 如何与分页和过滤一起实现排序?
Rob*_*roj 22
使用PageRequest,它是Pageable的一个实现,并且可以像你想要的那样一次实现分页和排序.例如,通过这个构造函数:
public PageRequest(int page, int size, Sort sort)
Run Code Online (Sandbox Code Playgroud)
更新:由于春季数据JPA 2.0以上的构造已被废弃,你应该使用静态工厂方法的:
public static PageRequest of(int page, int size, Sort sort)
Run Code Online (Sandbox Code Playgroud)