分頁和排序

本節文件介紹了 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 引數,並返回一個 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 識別使用儲存庫排序支援的排序引數。

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

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

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

© . This site is unofficial and not affiliated with VMware.