jpa分页查询_使用Spring Data JPA进行分页和排序

be3565e45b16f5698a3e94e760aab536.png

概观

在处理大量数据时,延迟处理通常是必不可少的。即使服务返回大量数据,消费者也不太可能使用它。考虑一个购物网站,客户在该网站上搜索产品,该网站有数千种产品可供展示。获取数千种产品并在网页上显示它们将非常耗时。在大多数情况下,客户甚至可能不会查看所有产品。

对于这种情况,使用称为分页的技术。首先只显示一小部分产品(页面),客户可以要求查看下一个子集(页面)等。

要了解JPA和Spring Data JPA的基础知识,请查看以下链接:

  • 动手弹簧数据JPA(Spring Data JPA学习系列)
  • 什么是JPA,Spring Data和Spring Data JPA

实体

为了本教程的目的,我们将考虑Employee 实体的最简单示例 。下面是 Employee 实体类。

@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;
    }
}

想要了解有关在Spring和Spring Boot中使用Java Persistence API(JPA)的更多信息?
查看以下附加链接:

  • 使用Spring Data JPA进行Spring Boot
  • 带有@EmbeddedId的Spring Data JPA Composite Key
  • Spring数据JPA由@EmbeddedId部分找到
  • Java Persistence API指南
  • Spring Data JPA查询方法

员工存储库

在 Spring Data JPA查询方法一文中,我们已经了解了Spring存储库接口和查询方法。在这里,我们需要学习分页,所以我们将使用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 参数。 Pageable 是一个由Spring定义的接口,它拥有一个PageRequest。让我们看看如何创建一个 PageRequest

Pageable pageable = PageRequest.of(0, 10);
Page<Employee> page = employeeRepository.findAll(pageable);

在第一行中,我们创建了 PageRequest10名员工,并要求提供第一页(0)。传递了页面请求findAll 以获取Employees页面作为响应。

如果我们想要访问下一组后续页面,我们可以每次都增加页码。

PageRequest.of(1, 10);
PageRequest.of(2, 10);
PageRequest.of(3, 10);
...

排序

Spring Data JPA提供了一个 Sort 对象以提供排序机制。我们来看看排序方式。

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

显然,第一个按“firstName”排序,另一个按“firstName”升序和“lastName”降序排序。

分页和排序

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我们看到其中一个方法返回 Slice ,另一个返回 Page。它们都是Spring Data JPA,其中 Page 是子接口 Slice。它们都用于保存和返回数据子集。我们一个一个地看看它们

切片

Slice 知道,如果它有内容,如果它是第一个或最后一个切片。它还能够返回 Pageable当前和先前切片中使用的。我们来看看一些重要的方法 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 是一个子接口, Slice 并有几个额外的方法。它知道表中的总页数以及记录总数。以下是一些重要的方法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的分页和排序示例中 我们了解了为什么需要分页。我们还学习了如何获取分页和排序的数据子集。最后,我们也看到了 SlicePage 接口以及他们之间的分歧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值