分頁和排序
本節文件介紹了 Spring Data REST 如何使用 Spring Data Repository 的分頁和排序抽象。要熟悉這些特性,請參閱您所使用的儲存庫實現(例如 Spring Data JPA)的 Spring Data 文件。
分頁
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 識別使用儲存庫排序支援的排序引數。
要讓結果按特定屬性排序,請新增一個 sort URL 引數,其值為您要排序的屬性名稱。您可以透過在屬性名稱後附加逗號 (,) 以及 asc 或 desc 來控制排序方向。以下示例將使用 PersonRepository 上定義的 findByNameStartsWith 查詢方法,查詢所有名稱以字母“K”開頭的 Person 實體,並新增按 name 屬性降序排列的排序資料:
curl -v "https://:8080/people/search/nameStartsWith?name=K&sort=name,desc"
要按多個屬性對結果進行排序,只需根據需要新增任意數量的 sort=PROPERTY 引數。它們按照在查詢字串中出現的順序新增到 Pageable 中。結果可以按頂級和巢狀屬性進行排序。使用屬性路徑表示法來表達巢狀排序屬性。不支援按可連結關聯(即指向頂級資源的連結)進行排序。