如何使用Spring Data JPA通过Sort和Pageable即时查询数据?


72

我在我的项目中尝试使用Spring数据JPA。我想知道是否有现成的API通过Sort和来查询数据Pageable。当然,我知道我可以自己编写该方法,我只想知道是否有一个现成的方法。我的DAO扩展JpaRepository,我发现可以调用以下方法:

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

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

Answers:


159

有两种方法可以实现此目的:

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


3
可以使用以下Javascript数据通过REST控件传递来自Javascript的多列排序数据:['name,asc','location,desc']
Stephane 2014年

感谢您的回答,它对我有所帮助!您能否将订单更改为排序?它是在Spring数据中排序。
curious1 2015年

4
这是我的解决方案,但是在春季,它是:Pageable pageable = new PageRequest(0,20,new Sort(new Sort.Order(Direction.ASC,“ name”),new Sort.Order(Direction.DESC,“ salary”) ));
西蒙(Simon)

是否可以将NUMBER数据类型(整数作为JPA实体类型)用作排序元素?我的数据库存储了NUMBER个数据,这些是记录的主要标识符,我可以在JPA分页支持的情况下按该列存储吗?
Ketan

15

Pageable也可以指定排序方式。从Java文档

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

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


2
这样,您可以为所有属性设置一个排序方向。如果要区分每个属性的排序方向,则必须使用Tomasz指出的Sort对象。
Mariusz 2013年

1

在2020年,由于PageRequest不赞成使用,因此可接受的答案有点过时了,因此您应该使用如下代码:

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

0

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

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

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


0

在我的情况下,使用PageableSorting在同一时间我使用方法如下。在这种情况下,我使用分页和id按降序排序来获取所有元素:

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

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


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

2
请对代码进行注释,即使它是自我解释的。
Andronicus

2
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
李慧夏
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.