gpt4 book ai didi

java - 带有排序的 Spring JPA 规范

转载 作者:IT老高 更新时间:2023-10-28 13:58:46 26 4
gpt4 key购买 nike

我正在使用 Spring JPA。

更准确地说,我使用的是扩展 JpaRepository 的存储库和 JpaSpecificationExecutor因为我需要分页、过滤和排序。

现在我的分页和过滤都可以正常工作,但我不能让排序也正常工作。

我有些失望地注意到 JpaSpecificationExecutorfindAll()方法:

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

您会在上方看到我尝试按姓氏排序,但这似乎没有效果。

我做错了什么;以及如何实现排序以及分页和过滤?

最佳答案

使用 PageRequest ,它是 Pageable 的实现, 并立即实现分页和排序,就像你想要的那样。例如通过 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)

关于java - 带有排序的 Spring JPA 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43028457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com