文章目录
- 前言
- 1. 分页查询的核心概念
-
- 1.1 Page对象
- 1.2 Pageable接口
- 2. 实现代码详解
-
- 2.1 实体类定义
- 2.2 Repository接口定义
- 2.3 服务层实现
- 2.4 控制器层实现
- 3. 关键点解析
-
- 3.1 Pageable对象的创建
- 3.2 Page对象的常用方法
- 3.4 错误用法示例
- 4.完整示例输出
-
- 4.1 基本分页查询输出
- 4.2 条件分页查询输出
- 4.3 自定义查询分页输出
- 5.最佳实践
- 6. 扩展功能
-
- 6.1 动态排序
- 6.2 导出分页结果
- 6.3 前端分页集成
- 结论
前言
在开发企业级应用时,分页查询是一个常见的需求。当数据量较大时,一次性加载所有数据不仅效率低下,还会占用大量内存。Spring Data JPA提供了Page对象和Pageable接口,帮助开发者轻松实现分页功能。本文将详细介绍这两个组件的使用方法,并提供完整的实现代码。
1. 分页查询的核心概念
1.1 Page对象
Page是Spring Data JPA提供的分页结果封装类,包含以下关键信息:
- 内容列表:当前页的数据项
- 总页数:符合条件的总页数
- 总记录数:符合条件的总记录数
- 当前页码:当前页的页码(从0开始)
- 每页记录数:每页显示的记录数
1.2 Pageable接口
Pageable是分页查询的参数接口,定义了分页和排序的参数:
- 页码:指定要查询的页码(从
0
开始) - 每页记录数:指定每页显示的记录数
- 排序规则:指定排序字段和排序方向
2. 实现代码详解
2.1 实体类定义
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
private Integer stock;
// 构造函数、getter和setter方法
public Product() {
}
public Product(String name, Double price, Integer stock) {
this.name = name;
this.price = price;
this.stock = stock;
}
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
@Override
public String toString() {
return "Product{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", stock=" + stock +
'}';
}
}
2.2 Repository接口定义
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface ProductRepository extends JpaRepository<Product, Long> {
// 基本分页查询方法
Page<Product> findAll(Pageable pageable);
// 带条件查询的分页方法
Page<Product> findByNameContaining(String name, Pageable pageable);
// 使用@Query注解的自定义分页查询
@Query("SELECT p FROM Product p WHERE p.price > :minPrice")
Page