使用Spring Data JPA進(jìn)行分頁和排序

概觀

在處理大量數(shù)據(jù)時(shí),延遲處理通常是必不可少的。即使服務(wù)返回大量數(shù)據(jù)磨镶,消費(fèi)者也不太可能使用它嗅义。考慮一個(gè)購物網(wǎng)站,客戶在該網(wǎng)站上搜索產(chǎn)品,該網(wǎng)站有數(shù)千種產(chǎn)品可供展示。獲取數(shù)千種產(chǎn)品并在網(wǎng)頁上顯示它們將非常耗時(shí)灰追。在大多數(shù)情況下,客戶甚至可能不會(huì)查看所有產(chǎn)品狗超。

對于這種情況弹澎,使用稱為分頁的技術(shù)。首先只顯示一小部分產(chǎn)品(頁面)努咐,客戶可以要求查看下一個(gè)子集(頁面)等苦蒿。

要了解JPA和Spring Data JPA的基礎(chǔ)知識,請查看以下鏈接:

動(dòng)手彈簧數(shù)據(jù)JPA(Spring Data JPA學(xué)習(xí)系列)

什么是JPA渗稍,Spring Data和Spring Data JPA

實(shí)體

為了本教程的目的佩迟,我們將考慮Employee? 實(shí)體的最簡單示例? 团滥。下面是? Employee 實(shí)體類。

@Entity

public class Employee {

? ? @Id private Long name;

? ? private String firstName;

? ? private String lastName;

? ? private Date dateOfBirth;

? ? private Integer age;

? ? private String designation;

? ? private double salary;

? ? private Date dateOfJoining;

? ? public Long getName() {

? ? ? ? return name;

? ? }

? ? public void setName(Long name) {

? ? ? ? this.name = name;

? ? }

? ? public String getFirstName() {

? ? ? ? return firstName;

? ? }

? ? public void setFirstName(String firstName) {

? ? ? ? this.firstName = firstName;

? ? }

? ? public String getLastName() {

? ? ? ? return lastName;

? ? }

? ? public void setLastName(String lastName) {

? ? ? ? this.lastName = lastName;

? ? }

? ? public Date getDateOfBirth() {

? ? ? ? return dateOfBirth;

? ? }

? ? public void setDateOfBirth(Date dateOfBirth) {

? ? ? ? this.dateOfBirth = dateOfBirth;

? ? }

? ? public Integer getAge() {

? ? ? ? return age;

? ? }

? ? public void setAge(Integer age) {

? ? ? ? this.age = age;

? ? }

? ? public String getDesignation() {

? ? ? ? return designation;

? ? }

? ? public void setDesignation(String designation) {

? ? ? ? this.designation = designation;

? ? }

? ? public double getSalary() {

? ? ? ? return salary;

? ? }

? ? public void setSalary(double salary) {

? ? ? ? this.salary = salary;

? ? }

? ? public Date getDateOfJoining() {

? ? ? ? return dateOfJoining;

? ? }

? ? public void setDateOfJoining(Date dateOfJoining) {

? ? ? ? this.dateOfJoining = dateOfJoining;

? ? }

}

想要了解有關(guān)在Spring和Spring Boot中使用Java Persistence API(JPA)的更多信息报强?查看以下附加鏈接:

使用Spring Data JPA進(jìn)行Spring Boot

帶有@EmbeddedId的Spring Data JPA Composite Key

Spring數(shù)據(jù)JPA由@EmbeddedId部分找到

Java Persistence API指南

Spring Data JPA查詢方法

員工存儲(chǔ)庫

在? Spring Data JPA查詢方法一文中灸姊,我們已經(jīng)了解了Spring存儲(chǔ)庫接口和查詢方法。在這里秉溉,我們需要學(xué)習(xí)分頁力惯,所以我們將使用Spring? PagingAndSortingRepository。

@Repository

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {

? ? Page<Employee> findAll(Pageable pageable);

? ? Page<Employee> findByFirstName(String firstName, Pageable pageable);

? ? Slice<Employee> findByFirstNameAndLastName(String firstName, String lastName, Pageable pageable);

}

分頁

看看吧? EmployeeRepository召嘶。 該方法接受? Pageable 參數(shù)父晶。 Pageable 是一個(gè)由Spring定義的接口,它擁有一個(gè)PageRequest弄跌。讓我們看看如何創(chuàng)建一個(gè)? PageRequest甲喝。

Pageable pageable = PageRequest.of(0, 10);

Page<Employee> page = employeeRepository.findAll(pageable);

在第一行中,我們創(chuàng)建了? PageRequest10名員工铛只,并要求提供第一頁(0)埠胖。傳遞了頁面請求? findAll 以獲取Employees頁面作為響應(yīng)。

如果我們想要訪問下一組后續(xù)頁面淳玩,我們可以每次都增加頁碼直撤。

PageRequest.of(1, 10);

PageRequest.of(2, 10);

PageRequest.of(3, 10);

...

排序

Spring Data JPA提供了一個(gè)? Sort 對象以提供排序機(jī)制。我們來看看排序方式凯肋。

employeeRepository.findAll(Sort.by("fistName"));

employeeRepository.findAll(Sort.by("fistName").ascending().and(Sort.by("lastName").descending());

顯然,第一個(gè)按“firstName”排序汽馋,另一個(gè)按“firstName”升序和“l(fā)astName”降序排序侮东。

分頁和排序

Pageable pageable = PageRequest.of(0, 20, Sort.by("firstName"));

Pageable pageable = PageRequest.of(0, 20, Sort.by("fistName").ascending().and(Sort.by("lastName").descending());

切片與 頁

在EmployeeRepository,我們看到其中一個(gè)方法返回? Slice 豹芯,另一個(gè)返回? Page悄雅。它們都是Spring Data JPA,其中? Page 是子接口? Slice铁蹈。它們都用于保存和返回?cái)?shù)據(jù)子集宽闲。我們一個(gè)一個(gè)地看看它們

切片

該? Slice 知道,如果它有內(nèi)容握牧,如果它是第一個(gè)或最后一個(gè)切片容诬。它還能夠返回? Pageable當(dāng)前和先前切片中使用的。我們來看看一些重要的方法? Slice沿腰。

List<T> getContent(); // get content of the slice

Pageable getPageable(); // get current pageable

boolean hasContent();

boolean isFirst();

boolean isLast();

Pageable nextPageable(); // pageable of the next slice

Pageable previousPageable(); // pageable of the previous slice

Page 是一個(gè)子接口览徒,? Slice 并有幾個(gè)額外的方法。它知道表中的總頁數(shù)以及記錄總數(shù)颂龙。以下是一些重要的方法Page习蓬。

static <T> Page<T> empty; //create an empty page

long getTotalElements(); // number of total elements in the table

int totalPages() // number of total pages in the table

摘要

在使用Spring Data JPA的分頁和排序示例中纽什,? 我們了解了為什么需要分頁。我們還學(xué)習(xí)了如何獲取分頁和排序的數(shù)據(jù)子集躲叼。最后芦缰,我們也看到了? Slice 和? Page 接口以及他們之間的分歧。

另外本人從事在線教育多年枫慷,將自己的資料整合建了一個(gè)公眾號让蕾,對于有興趣一起交流學(xué)習(xí)java可以微信搜索:“程序員文明”,里面有大神會(huì)給予解答流礁,也會(huì)有許多的資源可以供大家學(xué)習(xí)分享涕俗,歡迎大家前來一起學(xué)習(xí)進(jìn)步!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末神帅,一起剝皮案震驚了整個(gè)濱河市再姑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌找御,老刑警劉巖元镀,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霎桅,居然都是意外死亡栖疑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門滔驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遇革,“玉大人,你說我怎么就攤上這事揭糕÷芸欤” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵著角,是天一觀的道長揪漩。 經(jīng)常有香客問我,道長吏口,這世上最難降的妖魔是什么奄容? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮产徊,結(jié)果婚禮上昂勒,老公的妹妹穿的比我還像新娘。我一直安慰自己舟铜,他們只是感情好叁怪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著深滚,像睡著了一般奕谭。 火紅的嫁衣襯著肌膚如雪涣觉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天血柳,我揣著相機(jī)與錄音官册,去河邊找鬼。 笑死难捌,一個(gè)胖子當(dāng)著我的面吹牛膝宁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播根吁,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼员淫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了击敌?” 一聲冷哼從身側(cè)響起介返,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沃斤,沒想到半個(gè)月后圣蝎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衡瓶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年徘公,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮针。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡关面,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出十厢,到底是詐尸還是另有隱情等太,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布寿烟,位于F島的核電站澈驼,受9級特大地震影響辛燥,放射性物質(zhì)發(fā)生泄漏筛武。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一挎塌、第九天 我趴在偏房一處隱蔽的房頂上張望徘六。 院中可真熱鬧,春花似錦榴都、人聲如沸待锈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竿音。三九已至和屎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間春瞬,已是汗流浹背柴信。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宽气,地道東北人随常。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像萄涯,于是被迫代替她去往敵國和親绪氛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容