使用Spring Data JPA進行數據分頁與排序

file

1、導讀

若是一次性加載成千上萬的列表數據,在網頁上顯示將十分的耗時,用戶體驗很差。因此處理較大數據查詢結果展示的時候,分頁查詢是必不可少的。分頁查詢必然伴隨着必定的排序規則,不然分頁數據的狀態很難控制,致使用戶可能在不一樣的頁看到同一條數據。那麼,本文的主要內容就是給你們介紹一下,如何使用Spring Data JPA進行分頁與排序。前端

2、實體定義

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

@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方法、構造函數等實體類的模板代碼。

3、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);
}

4、實現分頁

 Pageable 是Spring定義的接口,用於分頁參數的傳遞,咱們看看如何使用它。首先將ArticleRepository注入到你須要進行持久層操做的類裏面,一般是一個@Service註解的類,而後在服務方法內使用以下代碼進行分頁操做:查詢第一頁(從0開始)的數據,每頁10條數據。springboot

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)對象裏面都可以獲取到(下文中有介紹)。函數

5、實現排序

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"));

6、Slice與Page

在ArticleRepository咱們看到了一個方法返回Slice和另外一個方法返回了Page。它們都是Spring Data JPA的數據響應接口,其中 Page 是 Slice的子接口。它們都用於保存和返回數據。大數據

6.1.Slice

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

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

Pageable  getPageable(); //當前切片的分頁信息

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

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

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

Pageable nextPageable(); // 下一個切片的分頁信息

Pageable previousPageable(); // 上一個切片的分頁信息

6.2.Page

 Page是Slice的子接口,如下是的一些重要方法。spa

//總頁數
int getTotalPages();

//總數據條數
long getTotalElements();

那麼,何時使用Slice?何時使用Page?
答:經過這兩個接口的函數定義能夠看出,Slice只關心是否是存在下一個分片(分頁),不會去數據庫count計算總條數、總頁數。因此比較適合大數據量列表的的鼠標或手指滑屏操做,不關心總共有多少頁,只關心有沒有下一頁。Page比較適合傳統應用中的table開發,須要知道總頁數和總條數。插件

期待您的關注

相關文章
相關標籤/搜索