1. 程式人生 > 程式設計 >Spring Data JPA進行資料分頁與排序的方法

Spring Data JPA進行資料分頁與排序的方法

一、導讀

如果一次性載入成千上萬的列表資料,在網頁上顯示將十分的耗時,使用者體驗不好。所以處理較大資料查詢結果展現的時候,分頁查詢是必不可少的。分頁查詢必然伴隨著一定的排序規則,否則分頁資料的狀態很難控制,導致使用者可能在不同的頁看到同一條資料。那麼,本文的主要內容就是給大家介紹一下,如何使用Spring Data JPA進行分頁與排序。

二、實體定義

我們使用一個簡單的實體定義:Article(文章)

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name="article")
public class Article {

 @Id
 @GeneratedValue
 private Long id;

 @Column(nullable = false,length = 32)
 private String author;

 @Column(nullable = false,unique = true,length = 32)
 private String title;

 @Column(length = 512)
 private String content;

 private Date createTime;
}

  • @Entity 表示這個類是一個實體類,接受JPA控制管理,對應資料庫中的一個表
  • @Table 指定這個類對應資料庫中的表名。如果這個類名和資料庫表名符合駝峰及下劃線規則,可以省略這個註解。如FlowType類名對應表名flow_type。
  • @Id 指定這個欄位為表的主鍵
  • @GeneratedValue(strategy=GenerationType.IDENTITY) 指定主鍵的生成方式,一般主鍵為自增的話,就採用GenerationType.IDENTITY的生成方式
  • @Column 註解針對一個欄位,對應表中的一列。nullable = false表示資料庫欄位不能為空,unique = true表示資料庫欄位不能有重複值,length = 32表示資料庫欄位最大程度為32.
  • @Data、@AllArgsConstructor、@NoArgsConstructor、@Builder都是外掛lombok的註解,用來幫助我們生成set、get方法、建構函式等實體類的模板程式碼。

三、Repository定義

定義一個介面ArticleRepository繼承PagingAndSortingRepository。PagingAndSortingRepository介面不僅包含基礎的CURD函式,還支援排序、分頁的介面函式定義。

public interface ArticleRepository extends PagingAndSortingRepository<Article,Long> {
  //查詢article表的所有資料,傳入Pageable分頁引數,不需要自己寫SQL
 Page<Article> findAll(Pageable pageable);
 //根據author欄位查詢article表資料,傳入Pageable分頁引數,不需要自己寫SQL
 Page<Article> findByAuthor(String author,Pageable pageable);
 //根據author欄位和title欄位,查詢article表資料,傳入Pageable分頁引數,不需要自己寫SQL
 Slice<Article> findByAuthorAndTitle(String author,String title,Pageable pageable);
}

四、實現分頁

Pageable是Spring定義的介面,用於分頁引數的傳遞,我們看看如何使用它。首先將ArticleRepository注入到你需要進行持久層操作的類裡面,通常是一個@Service註解的類,然後在服務方法內使用如下程式碼進行分頁操作:查詢第一頁(從0開始)的資料,每頁10條資料。

Pageable pageable = PageRequest.of(0,10); //第一頁
//Pageable pageable = PageRequest.of(0,10); //第二頁
//Pageable pageable = PageRequest.of(0,10); // 第三頁
//資料庫操作獲取查詢結果
Page<Article> articlePage = articleRepository.findAll(pageable);
//將查詢結果轉換為List
List<Article> articleList = articlePage.getContent();

findAll方法以Page類的物件作為響應,如果我們想獲取查詢結果List,可以使用getContent()方法。但是筆者不建議這樣進行轉換,因為前端展示一個分頁列表,不僅需要資料,而且還需要一些分頁資訊。如:當前第幾頁,每頁多少條,總共多少頁,總共多少條。這些資訊在Page(articlePage)物件裡面均可以獲取到(下文中有介紹)。

五、實現排序

Spring Data JPA提供了一個Sort物件,用以提供一種排序機制。讓我們看一下排序的方式。

articleRepository.findAll(Sort.by("createTime"));

articleRepository.findAll(Sort.by("author").ascending()
      .and(Sort.by("createTime").descending()));

第一個findAll方法是按照createTime的升序進行排序

第一個findAll方法是按照author的升序排序,再按照createTime的降序進行排序

分頁和排序在一起

Pageable pageable = PageRequest.of(0,10,Sort.by("createTime"));

六、Slice與Page

在ArticleRepository我們看到了一個方法返回Slice和另一個方法返回了Page。它們都是Spring Data JPA的資料響應介面,其中Page是Slice的子介面。它們都用於儲存和返回資料。

6.1.Slice

讓我們看一下Slice的一些重要方法。

List <T> getContent(); //獲取切片的內容

Pageable getPageable(); //當前切片的分頁資訊

boolean hasContent(); //是否有查詢結果?

boolean isFirst(); //是否是第一個切片

boolean isLast(); //是否是最後一個切片

Pageable nextPageable(); // 下一個切片的分頁資訊

Pageable previousPageable(); // 上一個切片的分頁資訊

6.2.Page

Page是Slice的子介面,以下是的一些重要方法。

//總頁數
int getTotalPages();

//總資料條數
long getTotalElements();

那麼,什麼時候使用Slice?什麼時候使用Page?

答:通過這兩個介面的函式定義可以看出,Slice只關心是不是存在下一個分片(分頁),不會去資料庫count計算總條數、總頁數。所以比較適合大資料量列表的的滑鼠或手指滑屏操作,不關心總共有多少頁,只關心有沒有下一頁。Page比較適合傳統應用中的table開發,需要知道總頁數和總條數。

總結

以上所述是小編給大家介紹的Spring Data JPA進行資料分頁與排序的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!