Spring Data JPA進(jìn)行數(shù)據(jù)分頁與排序的方法

一、導(dǎo)讀
如果一次性加載成千上萬的列表數(shù)據(jù),在網(wǎng)頁上顯示將十分的耗時,用戶體驗(yàn)不好。所以處理較大數(shù)據(jù)查詢結(jié)果展現(xiàn)的時候,分頁查詢是必不可少的。分頁查詢必然伴隨著一定的排序規(guī)則,否則分頁數(shù)據(jù)的狀態(tài)很難控制,導(dǎo)致用戶可能在不同的頁看到同一條數(shù)據(jù)。那么,本文的主要內(nèi)容就是給大家介紹一下,如何使用Spring Data JPA進(jìn)行分頁與排序。
二、實(shí)體定義
我們使用一個簡單的實(shí)體定義: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 表示這個類是一個實(shí)體類,接受JPA控制管理,對應(yīng)數(shù)據(jù)庫中的一個表
- @Table 指定這個類對應(yīng)數(shù)據(jù)庫中的表名。如果這個類名和數(shù)據(jù)庫表名符合駝峰及下劃線規(guī)則,可以省略這個注解。如FlowType類名對應(yīng)表名flow_type。
- @Id 指定這個字段為表的主鍵
- @GeneratedValue(strategy=GenerationType.IDENTITY) 指定主鍵的生成方式,一般主鍵為自增的話,就采用GenerationType.IDENTITY的生成方式
- @Column 注解針對一個字段,對應(yīng)表中的一列。nullable = false表示數(shù)據(jù)庫字段不能為空, unique = true表示數(shù)據(jù)庫字段不能有重復(fù)值,length = 32表示數(shù)據(jù)庫字段最大程度為32.
- @Data、@AllArgsConstructor、@NoArgsConstructor、@Builder都是插件lombok的注解,用來幫助我們生成set、get方法、構(gòu)造函數(shù)等實(shí)體類的模板代碼。
三、Repository定義
定義一個接口ArticleRepository繼承 PagingAndSortingRepository。PagingAndSortingRepository接口不僅包含基礎(chǔ)的CURD函數(shù),還支持排序、分頁的接口函數(shù)定義。
public interface ArticleRepository extends PagingAndSortingRepository<Article,Long> {
//查詢article表的所有數(shù)據(jù),傳入Pageable分頁參數(shù),不需要自己寫SQL
Page<Article> findAll(Pageable pageable);
//根據(jù)author字段查詢article表數(shù)據(jù),傳入Pageable分頁參數(shù),不需要自己寫SQL
Page<Article> findByAuthor(String author, Pageable pageable);
//根據(jù)author字段和title字段,查詢article表數(shù)據(jù),傳入Pageable分頁參數(shù),不需要自己寫SQL
Slice<Article> findByAuthorAndTitle(String author, String title, Pageable pageable);
}
四、實(shí)現(xiàn)分頁
Pageable 是Spring定義的接口,用于分頁參數(shù)的傳遞,我們看看如何使用它。首先將ArticleRepository注入到你需要進(jìn)行持久層操作的類里面,通常是一個@Service注解的類,然后在服務(wù)方法內(nèi)使用如下代碼進(jìn)行分頁操作:查詢第一頁(從0開始)的數(shù)據(jù),每頁10條數(shù)據(jù)。
Pageable pageable = PageRequest.of(0, 10); //第一頁 //Pageable pageable = PageRequest.of(0, 10); //第二頁 //Pageable pageable = PageRequest.of(0, 10); // 第三頁 //數(shù)據(jù)庫操作獲取查詢結(jié)果 Page<Article> articlePage = articleRepository.findAll(pageable); //將查詢結(jié)果轉(zhuǎn)換為List List<Article> articleList = articlePage.getContent();
findAll方法以Page類的對象作為響應(yīng),如果我們想獲取查詢結(jié)果List,可以使用getContent()方法。但是筆者不建議這樣進(jìn)行轉(zhuǎn)換,因?yàn)榍岸苏故疽粋€分頁列表,不僅需要數(shù)據(jù),而且還需要一些分頁信息。如:當(dāng)前第幾頁,每頁多少條,總共多少頁,總共多少條。這些信息在Page(articlePage)對象里面均可以獲取到(下文中有介紹)。
五、實(shí)現(xiàn)排序
Spring Data JPA提供了一個 Sort對象,用以提供一種排序機(jī)制。讓我們看一下排序的方式。
articleRepository.findAll(Sort.by("createTime"));
articleRepository.findAll(Sort.by("author").ascending()
.and(Sort.by("createTime").descending()));
第一個findAll方法是按照createTime的升序進(jìn)行排序
第一個findAll方法是按照author的升序排序,再按照createTime的降序進(jìn)行排序
分頁和排序在一起
Pageable pageable = PageRequest.of(0, 10,Sort.by("createTime"));
六、Slice與Page
在ArticleRepository我們看到了一個方法返回Slice和另一個方法返回了Page。它們都是Spring Data JPA的數(shù)據(jù)響應(yīng)接口,其中 Page 是 Slice的子接口。它們都用于保存和返回數(shù)據(jù)。
6.1.Slice
讓我們看一下 Slice的一些重要方法。
List <T> getContent(); //獲取切片的內(nèi)容 Pageable getPageable(); //當(dāng)前切片的分頁信息 boolean hasContent(); //是否有查詢結(jié)果? boolean isFirst(); //是否是第一個切片 boolean isLast(); //是否是最后一個切片 Pageable nextPageable(); // 下一個切片的分頁信息 Pageable previousPageable(); // 上一個切片的分頁信息
6.2.Page
Page是Slice的子接口,以下是的一些重要方法。
//總頁數(shù) int getTotalPages(); //總數(shù)據(jù)條數(shù) long getTotalElements();
那么,什么時候使用Slice?什么時候使用Page?
答:通過這兩個接口的函數(shù)定義可以看出,Slice只關(guān)心是不是存在下一個分片(分頁),不會去數(shù)據(jù)庫count計算總條數(shù)、總頁數(shù)。所以比較適合大數(shù)據(jù)量列表的的鼠標(biāo)或手指滑屏操作,不關(guān)心總共有多少頁,只關(guān)心有沒有下一頁。Page比較適合傳統(tǒng)應(yīng)用中的table開發(fā),需要知道總頁數(shù)和總條數(shù)。
總結(jié)
以上所述是小編給大家介紹的Spring Data JPA進(jìn)行數(shù)據(jù)分頁與排序的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Java實(shí)現(xiàn)較大二進(jìn)制文件的讀、寫方法
本篇文章主要介紹了Java實(shí)現(xiàn)較大二進(jìn)制文件的讀、寫方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
簡單講解Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法
這篇文章主要介紹了Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法,包括事件偵聽器等安卓開發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下2015-12-12
java基于poi導(dǎo)出excel透視表代碼實(shí)例
這篇文章主要介紹了java基于poi導(dǎo)出excel透視表代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
idea與eclipse項(xiàng)目相互導(dǎo)入的過程(圖文教程)
這篇文章主要介紹了idea與eclipse項(xiàng)目相互導(dǎo)入的過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
SLF4J報錯解決:No SLF4J providers were found的
這篇文章主要介紹了SLF4J報錯解決:No SLF4J providers were found的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06

