带有分页和排序的 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 Jpa: 分页和排序

如何在带有自定义过滤器的 Spring Data mongodb 中使用分页和排序?

Spring Boot常见考察点

Spring Data Cassandra 中的分页和排序查询

使用带有分页和排序的 ajax 将行动态添加到数据表

Spring Data 分页和排序 PagingAndSortingRepository的使用