对于最新的稳定版本,请使用 Spring Data REST 4.5.3! |
分页和排序
本节记录了 Spring Data REST 对 Spring Data Repository 分页和排序抽象的用法。要熟悉这些功能,请参阅您使用的存储库实现(例如 Spring Data JPA)的 Spring Data 文档。
寻呼
Spring Data REST 不是从大型结果集中返回所有内容,而是识别一些影响页面大小和起始页码的 URL 参数。
如果扩展PagingAndSortingRepository<T, ID>
并访问所有实体的列表,您将获得指向前 20 个实体的链接。要将页面大小设置为任何其他数字,请添加一个size
参数,如下所示:
http://localhost:8080/people/?size=5
前面的示例将页面大小设置为 5。
要在您自己的查询方法中使用分页,您需要更改方法签名以接受其他Pageable
参数并返回一个Page
或Slice
而不是List
.例如,以下查询方法导出到/people/search/nameStartsWith
并支持分页:
@RestResource(path = "nameStartsWith", rel = "nameStartsWith")
public Page findByNameStartsWith(@Param("name") String name, Pageable p);
Spring Data REST 导出器识别返回的Page
/Slice
并在响应正文中为您提供结果,就像使用非分页响应一样,但会向资源添加其他链接以表示数据的上一页和下一页。
上一个和下一个链接
每个分页响应都会使用 IANA 定义的链接关系,根据当前页面返回指向结果的上一页和下一页的链接prev
和next
.但是,如果您当前处于结果的第一页,则不prev
链接被渲染。对于结果的最后一页,没有next
链接被渲染。
考虑以下示例,我们将页面大小设置为 5:
curl localhost:8080/people?size=5
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/persons{&sort,page,size}", (1)
"templated" : true
},
"next" : {
"href" : "http://localhost:8080/persons?page=1&size=5{&sort}", (2)
"templated" : true
}
},
"_embedded" : {
… data …
},
"page" : { (3)
"size" : 5,
"totalElements" : 50,
"totalPages" : 10,
"number" : 0
}
}
在顶部,我们看到_links
:
1 | 这self Link 提供整个集合的一些选项。 |
2 | 这next 链接指向下一页,假设页面大小相同。 |
3 | 底部是有关页面设置的额外数据,包括页面大小、元素总数、总页数以及您当前正在查看的页码。 |
使用诸如curl 在命令行上,如果你的语句中有一个 & (),你需要用引号括住整个 URI。& |
请注意,self
和next
URI 实际上是 URI 模板。他们不仅接受size
,还page
和sort
作为可选标志。
如前所述,HAL 文档的底部包含有关该页面的详细信息集合。通过这些额外信息,您可以轻松配置滑块或指示器等 UI 工具,以反映用户在查看数据时的整体位置。例如,前面示例中的文档显示我们正在查看第一页(页码从 0 开始)。
以下示例显示了当我们遵循next
链接:
$ curl "http://localhost:8080/persons?page=1&size=5"
{
"_links" : {
"self" : {
"href" : "http://localhost:8080/persons{&sort,projection,page,size}",
"templated" : true
},
"next" : {
"href" : "http://localhost:8080/persons?page=2&size=5{&sort,projection}", (1)
"templated" : true
},
"prev" : {
"href" : "http://localhost:8080/persons?page=0&size=5{&sort,projection}", (2)
"templated" : true
}
},
"_embedded" : {
... data ...
},
"page" : {
"size" : 5,
"totalElements" : 50,
"totalPages" : 10,
"number" : 1 (3)
}
}
这看起来非常相似,除了以下区别:
1 | 这next 链接现在指向另一个页面,指示其与self 链接。 |
2 | 一个prev 现在出现链接,为我们提供了指向上一页的路径。 |
3 | 当前数字现在是 1(表示第二页)。 |
此功能允许将屏幕上的可选按钮映射到这些超媒体控件,从而实现 UI 体验的导航功能,而无需对 URI 进行硬编码。事实上,用户可以从页面大小列表中进行选择,动态更改所提供的内容,而无需重写next
和顶部或底部的 'prev 控件。
排序
Spring Data REST 识别使用存储库排序支持的排序参数。
要对特定属性对结果进行排序,请添加一个sort
URL 参数替换为要对结果进行排序的属性的名称。您可以通过附加逗号 (,
) 添加到属性名称加上asc
或desc
.以下将使用findByNameStartsWith
查询方法PersonRepository
对于所有人Person
名称以字母“K”开头的实体,并添加排序数据,对结果进行排序name
属性降序排列:
curl -v "http://localhost:8080/people/search/nameStartsWith?name=K&sort=name,desc"
要按多个属性对结果进行排序,请继续添加尽可能多的属性sort=PROPERTY
参数。它们被添加到Pageable
按照它们在查询字符串中出现的顺序。结果可以按顶级属性和嵌套属性排序。使用属性路径表示法来表示嵌套排序属性。不支持按可链接关联(即指向顶级资源的链接)进行排序。