spring-data-jpa 如何使用Spring Data JPA通过Sort和Pageable查询现成的数据?

nmpmafwu  于 2022-11-10  发布在  Spring
关注(0)|答案(7)|浏览(237)

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

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

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

zxlwwiss

zxlwwiss1#

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

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

yvt65v4c

yvt65v4c2#

Pageable也有一个指定排序的选项。从java doc

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

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

gwo2fgha

gwo2fgha3#

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

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

qcbq4gxm4#

Spring Pageable包含一个Sort。因此,如果您的请求包含这些值,它将返回一个排序的可分页。
请求:domain.com/endpoint?sort=[FIELDTOSORTBY]&[FIELDTOSORTBY].dir=[ASC|DESC]&page=0&size=20
它应该返回一个按提供的顺序提供的排序的可分页字段。

hgc7kmma

hgc7kmma5#

在我的例子中,为了同时使用PageableSorting,我使用了下面的方法。在这个例子中,我使用分页并按照id的降序对所有元素进行排序:

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

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

dly7yett

dly7yett6#

可以在请求的URL中提供排序参数和排序方向。Spring Pageable会自动解析URL参数并创建Pageable对象,该对象由您的rest控制器获取。我相信这是最好的解决方案之一,因为它有助于避免手动示例化PageRequest/Pageable对象(注意排序方向前的逗号字符):
domain.com/endpoint?sort=[FIELD],[asc|desc]&page=3&size=100

  • P.S.* Spring documentation中描述的其他排序方向用法示例对我不起作用(可能已过时)。
cidc1ykv

cidc1ykv7#

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

相关问题