分頁和排序
本節介紹了 Spring Data REST 如何使用 Spring Data Repository 的分頁和排序抽象。要熟悉這些特性,請參閱您使用的 repository 實現對應的 Spring Data 文件(例如 Spring Data JPA)。
分頁
Spring Data REST 不會返回大型結果集中的所有內容,而是會識別一些影響頁大小和起始頁碼的 URL 引數。
如果您擴充套件了 PagingAndSortingRepository<T, ID>
並訪問所有實體的列表,您將獲得指向前 20 個實體的連結。要將頁大小設定為其他任何數字,請新增一個 size
引數,如下所示
https://: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" : "https://:8080/persons{&sort,page,size}", (1)
"templated" : true
},
"next" : {
"href" : "https://: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 等工具時,如果您的語句中包含與號 (& ),則需要將整個 URI 用引號括起來。 |
請注意,self
和 next
URI 實際上是 URI 模板。它們不僅接受 size
,還接受 page
和 sort
作為可選標誌。
如前所述,HAL 文件的底部包含關於頁的一系列詳細資訊。這些額外資訊使您可以輕鬆配置滑塊或指示器等 UI 工具,以反映使用者檢視資料時的整體位置。例如,前面示例中的文件顯示我們正在檢視第一頁(頁碼從 0 開始)。
以下示例顯示了我們跟隨 next
連結時發生的情況
$ curl "https://:8080/persons?page=1&size=5"
{
"_links" : {
"self" : {
"href" : "https://:8080/persons{&sort,projection,page,size}",
"templated" : true
},
"next" : {
"href" : "https://:8080/persons?page=2&size=5{&sort,projection}", (1)
"templated" : true
},
"prev" : {
"href" : "https://: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(表示第二頁)。 |
此功能允許您將螢幕上的可選按鈕對映到這些超媒體控制元件,使您無需硬編碼 URI 即可實現 UI 體驗的導航功能。事實上,使用者可以從頁大小列表中選擇,動態更改提供的內容,而無需重寫頂部或底部的 next
和 prev
控制元件。
排序
Spring Data REST 識別使用 repository 排序支援的排序引數。
要按特定屬性對結果進行排序,請新增一個 sort
URL 引數,其值為要排序的屬性名稱。您可以透過在屬性名稱後附加逗號 (,
) 以及 asc
或 desc
來控制排序方向。以下示例將使用在 PersonRepository
上定義的 findByNameStartsWith
查詢方法,針對所有名稱以字母“K”開頭的 Person
實體,並新增按 name
屬性降序排列的排序資料。
curl -v "https://:8080/people/search/nameStartsWith?name=K&sort=name,desc"
要按多個屬性對結果進行排序,請根據需要新增任意數量的 sort=PROPERTY
引數。它們會按照在查詢字串中出現的順序新增到 Pageable
中。結果可以按頂級屬性和巢狀屬性排序。使用屬性路徑表示法來表達巢狀排序屬性。不支援按可連結關聯(即指向頂級資源的連結)進行排序。