【问题标题】:How to query data out of the box using Spring data JPA by both Sort and Pageable?如何通过 Sort 和 Pageable 使用 Spring data JPA 开箱即用地查询数据?
【发布时间】:2012-05-18 14:52:20
【问题描述】:

我正在我的项目中尝试Spring data JPA。我想知道SortPageable 是否有开箱即用的API 来查询数据。当然,我知道我可以自己编写那个方法,我只是想知道是否有一个开箱即用的方法。我的 DAO 扩展了JpaRepository,我发现可以调用以下方法:

findAll();
findAll(Pageable pageable);
findAll(Sort sort);

但是没有findAll(Sort sort, Pageable pageable)这样的方法,所以我很好奇。

【问题讨论】:

    标签: java spring jpa spring-data-jpa


    【解决方案1】:

    有两种方法可以实现:

    final PageRequest page1 = new PageRequest(
      0, 20, Direction.ASC, "lastName", "salary"
    );
    
    final PageRequest page2 = new PageRequest(
      0, 20, new Sort(
        new Order(Direction.ASC, "lastName"), 
        new Order(Direction.DESC, "salary")
      )
    );
    
    dao.findAll(page1);
    

    如您所见,第二种形式更加灵活,因为它允许为每个属性定义不同的方向 (lastName ASC, salary DESC)。

    【讨论】:

    • 通过 REST 控件从 Javascript 传递多列排序数据可以使用以下 Javascript 数据完成:['name,asc', 'location,desc']
    • 感谢您的回答,它帮助了我!你能把订单改成排序吗?它是 Spring 数据中的排序。
    • 这是我的解决方案,但在春天它是: Pageable pageable = new PageRequest(0, 20, new Sort(new Sort.Order(Direction.ASC, "name"), new Sort.Order( Direction.DESC, "薪水")));
    • 是否允许 NUMBER 数据类型(整数作为 JPA 实体类型)作为排序元素?我的数据库存储了 NUMBER 个数据,这些是记录的主要标识符,我可以通过 JPA 可分页支持按该列存储吗?
    【解决方案2】:

    Pageable 也有一个选项来指定排序。来自java doc

    PageRequest(int page, int size, Sort.Direction direction, String... properties) 
    

    创建一个应用了排序参数的新 PageRequest。

    【讨论】:

    • 这样您就可以为所有属性设置一个排序方向。如果你想区分每个属性的排序方向,你必须使用 Tomasz 指出的 Sort 对象。
    【解决方案3】:

    在 2020 年,接受的答案有点过时,因为 PageRequest 已弃用,因此您应该使用这样的代码:

    Pageable page = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("id").descending());
    return repository.findAll(page);
    

    【讨论】:

      【解决方案4】:

      Spring Pageable 包含一个排序。因此,如果您的请求具有值,它将返回一个已排序的可分页。

      请求: domain.com/endpoint?sort=[FIELDTOSORTBY]&[FIELDTOSORTBY].dir=[ASC|DESC]&page=0&size=20

      这应该返回按提供的顺序提供的按字段排序的可分页。

      【讨论】:

        【解决方案5】:

        就我而言,同时使用PageableSorting,如下所示。在这种情况下,我使用分页和id 降序排序所有元素:

        modelRepository.findAll(PageRequest.of(page, 10, Sort.by("id").descending()))
        

        如上所述,根据您的要求,您也可以使用 2 列对数据进行排序。

        【讨论】:

          【解决方案6】:
           public List<Model> getAllData(Pageable pageable){
                 List<Model> models= new ArrayList<>();
                 modelRepository.findAllByOrderByIdDesc(pageable).forEach(models::add);
                 return models;
             }
          

          【讨论】:

          • 请评论代码,即使它是不言自明的。
          • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
          猜你喜欢
          • 1970-01-01
          • 2015-07-31
          • 2015-02-21
          • 1970-01-01
          • 1970-01-01
          • 2021-03-30
          • 2019-02-09
          • 2014-08-10
          • 2017-10-09
          相关资源
          最近更新 更多