【问题标题】:How to sort a particular page number in Spring Data JPA?如何在 Spring Data JPA 中对特定页码进行排序?
【发布时间】:2022-06-10 22:18:15
【问题描述】:

我有这个分页问题,​​当我尝试在特定页码上按字段标题对表格进行排序时,PageRequest.of(page-1, 10, sort) 正在对整个表格进行排序,而不是在一个特定的页面。因此,该页面中返回的记录与排序前的上一条记录不同。

代码:

@Override
public Page<User> getPageAndSort(String field, String direction, int page) {

    Sort sort = direction.equalsIgnoreCase(Sort.Direction.ASC.name())
            ? Sort.by(field).ascending()
            : Sort.by(field).descending();

    Pageable pageable = PageRequest.of(page-1, 10, sort);

    return userRepo.findAll(pageable);
}

例如。我只想按 id 在第 1 页中排序。从第 1 页返回已排序的记录。其余页面或整个记录不应 受到影响。

谢谢。

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa


    【解决方案1】:

    我不认为有一种简单的方法可以在数据库中进行这种排序,并且由于您正在处理一个单独的页面,因为您将它呈现到 UI,所以无论如何我都会在内存中对其进行排序.

    或者,您可以使用如下结构的自定义 SQL 语句:

    SELECT * FROM (
        SELECT * FROM WHATEVER
        ORDER BY -- sort clause defining the pagination
        OFFSET ... LIMIT ... -- note that this clause is database dependent.
    ) ORDER BY -- your sort criteria within the page goes here
    

    您必须以编程方式构造此 SQL 语句,因此您不能使用 Spring Datas 的特殊功能,例如带注释的查询或查询派生。

    【讨论】:

      【解决方案2】:

      我认为 if 条件可以解决问题。根据条件创建 Pageable 实例。

      @Override
      public Page<User> getPageAndSort(String field, String direction, int page) {
      
          Sort sort = direction.equalsIgnoreCase(Sort.Direction.ASC.name())
                  ? Sort.by(field).ascending()
                  : Sort.by(field).descending();
      
          Pageable pageable = (page == 1)?PageRequest.of(page-1, 10, sort)
          :PageRequest.of(page-1, 10);
      
          return userRepo.findAll(pageable);
      }
      

      参考:https://www.baeldung.com/spring-data-jpa-pagination-sorting#:~:text=We%20can%20create%20a%20PageRequest%20object%20by%20passing,%280%2C%202%29%3B%20Pageable%20secondPageWithFiveElements%20%3D%20PageRequest.of%20%281%2C%205%29%3B

      我认为这会有所帮助。

      【讨论】:

        【解决方案3】:

        我不确定,我得到了你的问题,但是如果你想要某个排序的页面,数据库肯定应该创建查询计划,对所有数据进行排序并返回排序数据的某个偏移量(页面)。 如果不对整个数据进行排序,就不可能得到一个排序好的页面。

        【讨论】:

          【解决方案4】:

          我相信您只想对给定页面上的数据进行排序,这很难使用数据库查询来管理,它可能会对整个数据进行排序并给您第 n 页。

          我建议在以相同顺序检索后在给定页面上执行反向操作。

          1. 从数据库中检索第 n 页,始终按 asc。

          2. 如果需要,根据方向进行反向操作。

          这应该比依赖数据库进行排序操作要快。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-25
            • 1970-01-01
            • 2020-08-24
            • 1970-01-01
            • 1970-01-01
            • 2021-10-18
            • 2015-06-06
            • 2023-03-15
            相关资源
            最近更新 更多