分頁和排序

本節介紹了 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 引數,並返回 PageSlice 而不是 List。例如,以下查詢方法會匯出到 /people/search/nameStartsWith 並支援分頁

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

Spring Data REST 匯出器會識別返回的 Page/Slice 並在響應體中為您提供結果,就像它處理非分頁響應一樣,但會向資源新增額外的連結來表示資料的前一頁和下一頁。

每個分頁響應都會使用 IANA 定義的連結關係 prevnext,基於當前頁返回指向結果的前一頁和下一頁的連結。但是,如果您當前位於第一頁結果,則不會渲染 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 用引號括起來。

請注意,selfnext URI 實際上是 URI 模板。它們不僅接受 size,還接受 pagesort 作為可選標誌。

如前所述,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 體驗的導航功能。事實上,使用者可以從頁大小列表中選擇,動態更改提供的內容,而無需重寫頂部或底部的 nextprev 控制元件。

排序

Spring Data REST 識別使用 repository 排序支援的排序引數。

要按特定屬性對結果進行排序,請新增一個 sort URL 引數,其值為要排序的屬性名稱。您可以透過在屬性名稱後附加逗號 (,) 以及 ascdesc 來控制排序方向。以下示例將使用在 PersonRepository 上定義的 findByNameStartsWith 查詢方法,針對所有名稱以字母“K”開頭的 Person 實體,並新增按 name 屬性降序排列的排序資料。

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

要按多個屬性對結果進行排序,請根據需要新增任意數量的 sort=PROPERTY 引數。它們會按照在查詢字串中出現的順序新增到 Pageable 中。結果可以按頂級屬性和巢狀屬性排序。使用屬性路徑表示法來表達巢狀排序屬性。不支援按可連結關聯(即指向頂級資源的連結)進行排序。