如何通过 Sort 和 Pageable 使用 Spring data JPA 开箱即用地查询数据?

Posted

技术标签:

【中文标题】如何通过 Sort 和 Pageable 使用 Spring data JPA 开箱即用地查询数据?【英文标题】:How to query data out of the box using Spring data JPA by both Sort and Pageable? 【发布时间】: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)这样的方法,所以我很好奇。

【问题讨论】:

【参考方案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;
   

【讨论】:

请评论代码,即使它是不言自明的。 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。

以上是关于如何通过 Sort 和 Pageable 使用 Spring data JPA 开箱即用地查询数据?的主要内容,如果未能解决你的问题,请参考以下文章

解决 Webflux 中的 Pageable

如何使用 Repository Hibernate 和 Pageable 与 Java Spring 进行参数搜索?

Spring Data JPA之删除和修改

如何使用 Pageable 在 Spring Boot 和 Thymeleaf 中显示按点赞数排序的技能列表?

JPA findAll Pageable Request Total Count Group By Column

如何使用 Pageable 按地图值排序