带有分页和排序的 Spring Boot JPA 规范 API
Posted
技术标签:
【中文标题】带有分页和排序的 Spring Boot JPA 规范 API【英文标题】:Spring boot JPA Specification API with Pagination and Sorting 【发布时间】:2021-01-28 18:11:16 【问题描述】:我正在尝试在 Spring Boot 中实现搜索。由于搜索参数是动态的,我不得不去规范 api。我的要求是搜索给定参数的订单并按创建日期对这些订单进行排序。由于数据可能很大,因此 api 也应该支持分页。 下面是谓词的代码片段。
public search(OrderSearchCriteria searchCriteria, Integer pageNo, Integer pageSize)
Pageable pageRequest = (!ObjectUtils.isEmpty(pageNo) && !ObjectUtils.isEmpty(pageSize))
? PageRequest.of(pageNo, pageSize)
: Pageable.unpaged();
Page<Order> ordersPage = this.dao.findAll(((Specification<Order>)(root, query, criteriaBuilder) ->
// my search params, its more than what is shown here
Long id = searchCriteria.getId();
Priority priority = searchCriteria.getPriority();
List<Predicate> predicates = new ArrayList<>();
if(!ObjectUtils.isEmpty(id))
predicates.add(criteriaBuilder.and(criteriaBuilder.equal(root.get("id"), id)));
if(!ObjectUtils.isEmpty(priority))
predicates.add(criteriaBuilder.and(criteriaBuilder.equal(root.get("priority"), priority)));
// This line is causing the issue
query.orderBy(criteriaBuilder.desc(root.get("creationDate")));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
), pageRequest);
问题是,如果我按行添加这种排序 query.orderBy(criteriaBuilder.desc(root.get("creationDate")))
分页不起作用。第 0 页和第 1 页都显示相同的结果(相同的顺序)给定大小为 1。但第 2 页显示的结果与预期的不同。但是,如果我删除上面显示的按行排序,则代码按预期工作。我如何在没有这些问题的情况下同时支持分页和排序?我也尝试在 pagerequest 中应用排序。但同样的问题PageRequest.of(pageNo, size, sort.by(DESC, "creationDate"))
。感谢帮助。
【问题讨论】:
【参考方案1】:“它显示相同的结果”是什么意思?可能有多个条目具有相同的创建日期,如果省略排序,Spring Data 默认会按 id 排序以提供一致的结果。
【讨论】:
以上是关于带有分页和排序的 Spring Boot JPA 规范 API的主要内容,如果未能解决你的问题,请参考以下文章
如何在带有自定义过滤器的 Spring Data mongodb 中使用分页和排序?