若是一次性加載成千上萬的列表數據,在網頁上顯示將十分的耗時,用戶體驗很差。因此處理較大數據查詢結果展示的時候,分頁查詢是必不可少的。分頁查詢必然伴隨着必定的排序規則,不然分頁數據的狀態很難控制,致使用戶可能在不一樣的頁看到同一條數據。那麼,本文的主要內容就是給你們介紹一下,如何使用Spring Data JPA進行分頁與排序。前端
咱們使用一個簡單的實體定義: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; }
定義一個接口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條數據。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)對象裏面都可以獲取到(下文中有介紹)。函數
Spring Data JPA提供了一個 Sort
對象,用以提供一種排序機制。讓咱們看一下排序的方式。學習
articleRepository.findAll(Sort.by("createTime")); articleRepository.findAll(Sort.by("author").ascending() .and(Sort.by("createTime").descending()));
Pageable pageable = PageRequest.of(0, 10,Sort.by("createTime"));
在ArticleRepository咱們看到了一個方法返回Slice和另外一個方法返回了Page。它們都是Spring Data JPA的數據響應接口,其中 Page 是 Slice的子接口。它們都用於保存和返回數據。大數據
讓咱們看一下 Slice的一些重要方法。ui
List <t> getContent(); //獲取切片的內容 Pageable getPageable(); //當前切片的分頁信息 boolean hasContent(); //是否有查詢結果? boolean isFirst(); //是不是第一個切片 boolean isLast(); //是不是最後一個切片 Pageable nextPageable(); // 下一個切片的分頁信息 Pageable previousPageable(); // 上一個切片的分頁信息
Page是Slice的子接口,如下是的一些重要方法。.net
//總頁數 int getTotalPages(); //總數據條數 long getTotalElements();
那麼,何時使用Slice?何時使用Page? 答:經過這兩個接口的函數定義能夠看出,Slice只關心是否是存在下一個分片(分頁),不會去數據庫count計算總條數、總頁數。因此比較適合大數據量列表的的鼠標或手指滑屏操做,不關心總共有多少頁,只關心有沒有下一頁。Page比較適合傳統應用中的table開發,須要知道總頁數和總條數。插件