对于最新的稳定版本,请使用 Spring Data REST 4.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data REST 4.3.1Spring中文文档

本节记录了Spring Data REST对Spring Data Repository分页和排序抽象的使用。要熟悉这些功能,请参阅您使用的存储库实现(例如 Spring Data JPA)的 Spring Data 文档。Spring中文文档

寻呼

Spring Data REST不会从大型结果集中返回所有内容,而是识别一些影响页面大小和起始页码的URL参数。Spring中文文档

如果扩展并访问所有实体的列表,则会获得指向前 20 个实体的链接。若要将页面大小设置为任何其他数字,请添加一个参数,如下所示:PagingAndSortingRepository<T, ID>sizeSpring中文文档

http://localhost:8080/people/?size=5

前面的示例将页面大小设置为 5。Spring中文文档

若要在自己的查询方法中使用分页,需要更改方法签名以接受其他参数并返回 or 而不是 .例如,以下查询方法导出到分页并支持分页:PageablePageSliceList/people/search/nameStartsWithSpring中文文档

@RestResource(path = "nameStartsWith", rel = "nameStartsWith")
public Page findByNameStartsWith(@Param("name") String name, Pageable p);

Spring Data REST导出器识别返回的/,并在响应正文中为您提供结果,就像使用非分页响应一样,但会向资源添加其他链接以表示数据的上一页和下一页。PageSliceSpring中文文档

每个分页响应都使用 IANA 定义的一页和下一页链接关系,根据当前页面返回指向上一页和下一页结果的链接。但是,如果您当前位于结果的第一页,则不会呈现任何链接。对于结果的最后一页,不呈现任何链接。prevnextSpring中文文档

请考虑以下示例,其中我们将页面大小设置为 5:Spring中文文档

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
  }
}

在顶部,我们看到:_linksSpring中文文档

1 该链接提供了带有一些选项的整个集合。self
2 该链接指向下一页,假定页面大小相同。next
3 底部是有关页面设置的额外数据,包括页面大小、元素总数、页面总数以及您当前正在查看的页码。
使用命令行等工具时,如果语句中有 & 号(),则需要将整个 URI 括在引号中。curl&

请注意,和 URI 实际上是 URI 模板。它们不仅接受 ,而且还接受 和 作为可选标志。selfnextsizepagesortSpring中文文档

如前所述,HAL 文档的底部包含有关页面的详细信息的集合。通过这些额外的信息,您可以轻松地配置 UI 工具(如滑块或指示器),以反映用户查看数据时的整体位置。例如,前面示例中的文档显示我们正在查看第一页(页码从 0 开始)。Spring中文文档

以下示例显示了当我们点击链接时会发生什么:nextSpring中文文档

$ 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)
  }
}

这看起来非常相似,但以下差异除外:Spring中文文档

1 该链接现在指向另一个页面,指示其与链接的相对透视。nextself
2 现在会出现一个链接,为我们提供上一页的路径。prev
3 当前数字现在为 1(表示第二页)。

此功能允许您将屏幕上的可选按钮映射到这些超媒体控件,从而实现 UI 体验的导航功能,而无需对 URI 进行硬编码。事实上,用户可以从页面大小列表中进行选择,动态更改提供的内容,而无需重写顶部或底部的 和 'prev 控件。nextSpring中文文档

1 该链接提供了带有一些选项的整个集合。self
2 该链接指向下一页,假定页面大小相同。next
3 底部是有关页面设置的额外数据,包括页面大小、元素总数、页面总数以及您当前正在查看的页码。
使用命令行等工具时,如果语句中有 & 号(),则需要将整个 URI 括在引号中。curl&
1 该链接现在指向另一个页面,指示其与链接的相对透视。nextself
2 现在会出现一个链接,为我们提供上一页的路径。prev
3 当前数字现在为 1(表示第二页)。

排序

Spring Data REST可识别使用存储库排序支持的排序参数。Spring中文文档

若要对特定属性对结果进行排序,请添加一个 URL 参数,其中包含要对结果进行排序的属性的名称。您可以通过在属性名称后面附加逗号 () 加上 或 来控制排序的方向。以下将使用在 for all entities 上定义的查询方法,其名称以字母“K”开头,并添加排序数据,按降序对属性的结果进行排序:sort,ascdescfindByNameStartsWithPersonRepositoryPersonnameSpring中文文档

curl -v "http://localhost:8080/people/search/nameStartsWith?name=K&sort=name,desc"

若要按多个属性对结果进行排序,请根据需要继续添加任意数量的参数。它们将按照它们在查询字符串中的显示顺序添加到 中。结果可以按顶级属性和嵌套属性排序。使用属性路径表示法表示嵌套排序属性。不支持按可链接关联(即指向顶级资源的链接)进行排序。sort=PROPERTYPageableSpring中文文档