如何使用 SpringdataJPA 通过 SortandPageable 查询开箱即用的数据?

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

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

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

107760 次浏览

Pageable 也有一个指定排序的选项

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

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

有两种方法可以做到这一点:

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)。

 public List<Model> getAllData(Pageable pageable){
List<Model> models= new ArrayList<>();
modelRepository.findAllByOrderByIdDesc(pageable).forEach(models::add);
return models;
}

Spring Pageable 包含一个 Sort。因此,如果您的请求包含这些值,它将返回一个排序的 Pageable。

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

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

在我的例子中,同时使用 PageableSorting,我使用如下。在这个例子中,我使用分页法获取所有元素,并按降序按 id进行排序:

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

像上面一样,基于您的需求,您也可以使用2列对数据进行排序。

在2020年,由于 PageRequest已经过时,所以接受的答案已经过时了,所以你应该使用这样的代码:

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

可以在请求的 URL 中提供排序参数和排序方向。 SpringPageable 自动解析 URL 参数并创建由您的休息控制器获得的 Pageable 对象。我相信这是最好的解决方案之一,因为它有助于避免手动 PageRequest/Pageable 对象实例化(注意排序方向前的逗号字符) :

Domain.com/endpoint?sort= [ FIELD ] ,[ asc | desc ] & page = 3 & size = 100

Spring 文档中描述的其他排序方向用法的例子对我来说不起作用(可能已经过时了)。