6. 分页和排序
This文件Spring Data REST中的Spring REST数据的使用和排序抽象。要熟悉使用这些功能,请参阅你的using.实施Spring Data REST文件
6.1. 分页
而不是从一个大的结果集返回所有东西,Spring Data REST承认某些URL参数会影响页面大小和起始页码。
如果扩展PagingAndSortingRepository<T,ID>
和访问所有实体的名单,你会得到链接到前20个实体。要设置页面大小,任何其他数字,添加一个size
参数:
http://localhost:8080/people/?size=5
这段代码将设置页面大小为五页
如果要在自己的查询方式使用分页,您需要更改方法签名去接受一个额外的Pageable
参数,并返回一个Page
而非List
。例如,下面的查询方法将出口到/people/search/nameStartsWith
,将支持分页:
@RestResource(path ="nameStartsWith", rel ="nameStartsWith")publicPage findByNameStartsWith(@Param("name")String name,Pageable p);
Spring Data REST出口将识别返回Page
,让您在响应体内的结果,就像它与非分页反应,但其他链接将被添加到资源来表示上一个和下一个数据的页。
6.1.1. 前一个和下一个链接
每个页面响应将返回链接到基于使用IANA定义的链接关系[prev
]当前页面(http://www.w3.org/TR/html5/links.html#link成果的上一页和下一页型 - 上一个)和[next
](http://www.w3.org/TR/html5/links.html#link-type-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 链接提供了整个收集与一些选项 |
---|---|
2 | 这next 链接指向下一个页面,假设在同一页面大小。 |
3 | 在底部是关于页面设置额外的数据,包括页面的大小,总的元素,总页数,目前正在查看的页面数。 |
当使用工具,如curl卷曲在命令行,如果你有一个引号“&”在声明中,包住整个URL。 | |
---|---|
同样重要的是要注意到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
控制顶部或底部。
6.2. 排序
Spring Data REST参数排序使用存储库分类的支持。
结果排序在一个特定的属性,添加一个sort
URL参数和属性的名称你想进行排序的结果中。你可以控制的方向通过添加一个,
属性名称asc
或desc
。下面将使用findByNameStartsWith
查询方法定义在所有 Person
的PersonRepository
实体以字母"K"开头的名称并添加订单数据,结果在降序排列的name
属性:
curl -v "http://localhost:8080/people/search/nameStartsWith?name=K&sort=name,desc"
排序结果由多个属性,不断添加尽可能多的sort=PROPERTY
的参数,它们将被按照出现在查询字符串中的顺序添加到Pageable
中