概觀
在處理大量數(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部分找到
員工存儲(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)步!