72

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

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

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

4

6 回答 6

160

有两种方法可以实现这一点:

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) 定义不同的方向。

于 2012-05-10T06:19:17.857 回答
15

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

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

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

于 2012-05-10T05:09:43.130 回答
2

在 2020 年,接受的答案有点过时了,因为PageRequest不推荐使用,所以你应该使用这样的代码:

Pageable page = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("id").descending());
return repository.findAll(page);
于 2020-07-14T13:09:43.517 回答
0

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

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

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

于 2019-02-11T00:23:34.983 回答
0

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

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

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

于 2020-02-02T10:01:01.090 回答
-1
 public List<Model> getAllData(Pageable pageable){
       List<Model> models= new ArrayList<>();
       modelRepository.findAllByOrderByIdDesc(pageable).forEach(models::add);
       return models;
   }
于 2019-02-10T06:57:25.077 回答