目录:

  1. 引言
  2. 分页查询基础回顾
    2.1 Spring Data JPA分页接口
    2.2 Pageable与Page的使用
    2.3 常见分页参数设计
  3. Spring Data REST简介
    3.1 HATEOAS与超媒体驱动API
    3.2 Spring Data REST核心功能
    3.3 自动暴露Repository接口
  4. 整合Spring Boot与Spring Data REST
    4.1 项目依赖与配置
    4.2 自定义Repository REST资源
    4.3 分页查询自动链接示例
  5. 高级定制:动态筛选与分页导航
    5.1 Querydsl结合Spring Data REST
    5.2 参数解析与Specification实现
    5.3 自定义分页元数据扩展
  6. 实战案例:商品管理微服务
    6.1 领域模型与数据库设计
    6.2 常见分页场景实现
    6.3 前端集成示例(Vue.js/Angular)
  7. 性能优化策略
    7.1 避免N+1查询与批量抓取
    7.2 索引与分区策略
    7.3 缓存分页结果与Redis
  8. 安全与限流
    8.1 JWT身份认证与权限控制
    8.2 分页接口防刷策略
  9. 常见问题与排查
    9.1 总页数计算不准确
    9.2 路由403/404问题
    9.3 性能瓶颈定位

  1. 引言

在现代微服务架构中,客户端经常需要分页加载海量数据,如电商商品、日志记录或社交动态。传统API往往返回固定格式的分页结果,开发者需手动拼装分页链接,既繁琐又易出错。Spring Data REST基于HATEOAS超媒体原则,可自动生成上一页、下一页、首尾页链接,实现零侵入式的数据导航效果。本文将带领读者一步步掌握Spring Boot分页查询进阶技巧,助力打造高效、友好的RESTful分页接口。

  1. 分页查询基础回顾

2.1 Spring Data JPA分页接口
Spring Data JPA提供了PagingAndSortingRepository,继承自CrudRepository,额外暴露了分页和排序接口。常用方法:

public interface UserRepository extends PagingAndSortingRepository<User, Long> {// 继承分页与排序能力,无需额外定义
}

开发者可直接通过repository.findAll(Pageable pageable)获取Page<T>对象,其中包含总记录数、总页数及当前页内容。

2.2 Pageable与Page的使用
org.springframework.data.domain.Pageable用于封装分页请求参数,常见构造方式:

Pageable pageable = PageRequest.of(pageIndex, pageSize, Sort.by("createdAt").descending());
Page<User> page = userRepository.findAll(pageable);

Page<T>则包含:

  • getContent():当前页列表
  • getTotalPages():总页数
  • hasNext() / hasPrevious():是否可翻页
  • getPageable():当前分页参数

2.3 常见分页参数设计
为了方便前端交互,我们一般在URL中使用?page=0&size=20&sort=createdAt,desc参数格式,Spring Boot通过PageableHandlerMethodArgumentResolver自动解析。可在配置中全局定制默认页大小与最大页大小:

spring:data:web:pageable:default-page-size: 20max-page-size: 100
  1. Spring Data REST简介

3.1 HATEOAS与超媒体驱动API
HATEOAS(Hypermedia as the Engine of Application State)是一种REST设计原则,强调服务端在响应中提供必要的链接,指导客户端下一步操作。Spring HATEOAS提供EntityModel<T>Link构建超媒体资源。

3.2 Spring Data REST核心功能
Spring Data REST通过扫描项目中继承Repository的接口,自动生成对应的CRUD REST API,并支持分页、排序、投影、事件拦截器等多项功能,极大降低开发成本。

3.3 自动暴露Repository接口
只需添加依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

Spring Boot启动后,访问/users即可得到分页响应:

{"_embedded": {"users": [...]},"page": {"size":20,"totalElements":100,"totalPages":5,"number":0},"_links": {"self":...,"next":...,"prev":...,"first":...,"last":...}
}
  1. 整合Spring Boot与Spring Data REST

4.1 项目依赖与配置
pom.xml中同时引入:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

application.yml中开启HATEOAS链接暴露:

spring:data:rest:default-page-size: 20max-page-size: 100base-path: /api

4.2 自定义Repository REST资源
若想自定义暴露路径或方法名称,可在接口上添加@RepositoryRestResource注解:

@RepositoryRestResource(path = "accounts", collectionResourceRel = "accounts")
public interface AccountRepository extends PagingAndSortingRepository<Account, Long> {Page<Account> findByStatus(@Param("status") String status, Pageable pageable);
}

访问/api/accounts/search/findByStatus?status=ACTIVE即可分页查询。

4.3 分页查询自动链接示例
示例响应:

{"_embedded": {"accounts":[...]},"page":{"size":20,"totalElements":45,"totalPages":3,"number":1},"_links":{"self":{"href":"http://.../accounts?page=1&size=20"},"first":{"href":"...page=0"},"prev":{"href":"...page=0"},"next":{"href":"...page=2"},"last":{"href":"...page=2"}}
}
  1. 高级定制:动态筛选与分页导航

5.1 Querydsl结合Spring Data REST
集成Querydsl后,可动态构建复杂查询:

public interface ProductRepository extends QuerydslPredicateExecutor<Product>, PagingAndSortingRepository<Product, Long> {}

前端传入?predicate=name.contains=book;price.gt=100&page=0&size=10即可组合查询和分页。

5.2 参数解析与Specification实现
使用JpaSpecificationExecutor

public interface OrderRepository extends JpaSpecificationExecutor<Order>, PagingAndSortingRepository<Order, Long> {}
// 构造Specification
Specification<Order> spec = (root, query, cb) -> cb.equal(root.get("status"), status);
Page<Order> result = orderRepository.findAll(spec, pageable);

通过自定义PageableHandlerMethodArgumentResolverCustomizer可让REST端点解析spec参数。

5.3 自定义分页元数据扩展
可实现RepresentationModelProcessor<CollectionModel<?>>,为分页响应添加自定义元数据:

@Component
public class PageMetadataProcessor implements RepresentationModelProcessor<CollectionModel<?>> {@Overridepublic CollectionModel<?> process(CollectionModel<?> model) {model.add(Link.of("/api/docs/pagination", "pagination-docs"));return model;}
}
  1. 实战案例:商品管理微服务

6.1 领域模型与数据库设计

  • Product实体:id, name, description, price, category, createdAt
  • 索引:price、category字段建立索引

6.2 常见分页场景实现

  • 全量分页
  • 分类筛选分页:/products/search/findByCategory?category=electronics
  • 价格区间分页组合查询

6.3 前端集成示例(Vue.js)

async fetchProducts(page = 0) {const res = await axios.get(`/api/products?page=${page}&size=20`);this.products = res.data._embedded.products;this.links = res.data._links;
}

通过links.next.href动态生成下一页按钮。

  1. 性能优化策略

7.1 避免N+1查询与批量抓取
使用@EntityGraphjoin fetch解决懒加载触发的N+1问题。

7.2 索引与分区策略
针对大表,可考虑范围分区或HASH分区,并对分页字段进行复合索引。

7.3 缓存分页结果与Redis
基于Spring Cache将分页结果按页存入Redis,减少数据库压力。

  1. 安全与限流

8.1 JWT身份认证与权限控制
通过@PreAuthorize("hasRole('ROLE_USER')")控制不同分页接口访问权限。

8.2 分页接口防刷策略
基于令牌桶算法对分页请求进行限流,并结合用户身份鉴别。

  1. 常见问题与排查

9.1 总页数计算不准确
检查totalElements返回值是否受到过滤器或Specification影响。

9.2 路由403/404问题
确认Repository路径与base-path配置一致,并检查CORS策略。

9.3 性能瓶颈定位
使用Spring Boot Actuator和Micrometer进行请求跟踪与时序数据库监控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/82307.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/82307.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/82307.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Datagear] [SQL]实现分组统计同时带汇总行的两种方式对比分析

在进行数据可视化开发时,我们经常会遇到用户提出的需求:除了展示按某字段分组统计的数据外,还希望看到一个“整体总计”的数据行。这种汇总行在报表、图表展示中极为常见,可以帮助用户快速理解全局数据水平。 实现这一功能的方法主要有两种:一种是使用 SQL 的 GROUP BY ..…

Docker常用命令介绍

Docker常用命令 1、本地镜像管理 save 命令 将一个或多个 Docker 镜像保存到一个 tar 归档文件中&#xff0c;以便在其他环境中分发或备份。 # 语法&#xff1a;docker save [OPTIONS] IMAGE [IMAGE...]# 保存单个镜像到文件 docker save -o myimage.tar myimage:latest# 保…

09 接口自动化-用例管理框架pytest之allure报告定制以及数据驱动

文章目录 一、企业级的Allure报告的定制左边的定制&#xff1a;右边的定制&#xff1a;1.用例的严重程度/优先级2.用例描述3.测试用例连接的定制4.测试用例步骤的定制5.附件的定制 二、企业中真实的定制有哪些&#xff1f;三、allure报告如何在本地访问四、allure中的数据驱动装…

DDoS防护实战——从基础配置到高防IP部署

一、基础防护&#xff1a;服务器与网络层加固 Linux内核优化&#xff1a; 调整TCP协议栈参数&#xff0c;缓解SYN Flood攻击&#xff1a; # 启用SYN Cookie并减少超时时间 echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout…

华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent

前引&#xff1a;重磅来袭&#xff01;本次以DeepSeek-V3/R1商用大模型和Dify-LLM应用平台一键部署为核心&#xff0c;专为新手打造“开箱即用”的AI开发体验。无论你是想快速搭建企业级AI应用&#xff0c;还是探索大模型落地的无限可能&#xff0c;只需跟随小编实现三步走&…

SQLAlchemy 2.0 查询使用指南

SQLAlchemy 2.0 查询使用指南 1. 环境设置 首先&#xff0c;需要安装 SQLAlchemy 2.0 版本。假设你使用的是 SQLite 数据库&#xff0c;可以通过以下命令安装 SQLAlchemy&#xff1a; pip install sqlalchemy接着&#xff0c;我们创建数据库连接并初始化会话&#xff1a; f…

Windows 使用 WSL 安装 Ubuntu

一&#xff0c;前言 Windows 上轻松跑 Linux 又不想用笨重的VMware 和VirtualBox &#xff0c;怎么办&#xff1f; 开源项目 Windows Subsystem for Linux (WSL)。它解决了许多开发者在 Windows 和 Linux 间切换的痛点&#xff0c;实现在 Windows 上无缝跑 Linux 工具和命令。…

[Excel VBA]如何製作買三送一優惠條件的POS結帳介面?

Excel I VBA I 買三送一優惠條件的POS結帳機 因應商品特賣活動&#xff0c;結帳介面需整合特定優惠條件&#xff0c;如買三送一&#xff0c;買五送二等等優惠條件。本文封面影片以買三送一為範例&#xff0c;並搭配VBA和對應按鈕&#xff0c;而實現銷售訂單紀錄和即時更新庫存等…

3d世界坐标系转屏幕坐标系

世界坐标 ——> NDC标准设备坐标 ——> 屏幕坐标 标准设备NDC坐标系 屏幕坐标系 .project方法将 将向量(坐标)从世界空间投影到相机的标准化设备坐标 (NDC) 空间。 手动实现HTML元素定位到模型位置&#xff0c;实现模型标签效果&#xff08;和css2Render原理同理&#…

Idea出现 100% classes 等

总是误点出来&#xff0c;每次又忘了怎么消除&#xff0c;在这里记录一下。 出现这样&#xff1a; 操作idea界面的&#xff1a;点击View->Tool Windows ->Coverage&#xff0c;然后关掉

从零开始学习QT——第一步

一、Qt 1.1、Qt是什么 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 1.2、Qt的发展历程 1991年 Qt最早由芬兰奇趣科技开发 1996年 进入商业…

MySQL 8.0 OCP 1Z0-908 171-180题

Q171.Examine this MySQL client command to connect to a remote database: mysql-h remote-example.org-u root–protocolTCP–ssl-mode Which two–ss1-mode values will ensure that an X.509-compliant certificate will be used to establish the SSL/TLS connection to …

【机器学习】 关于外插修正随机梯度方法的数值实验

1. 随机梯度下降&#xff08;SGD&#xff09; 迭代格式&#xff1a; x k 1 x k − η k ∇ f i ( x k ) x_{k1} x_k - \eta_k \nabla f_i(x_k) xk1​xk​−ηk​∇fi​(xk​) 其中&#xff0c; η k \eta_k ηk​ 为步长&#xff08;可能递减&#xff09;&#xff0c; ∇ f…

每日c/c++题 备战蓝桥杯(洛谷P3382 三分法求极值详解)

洛谷P3382 三分法求极值详解 题目描述 P3382 三分法 要求在给定区间内寻找一个多项式函数的最大值点。题目保证函数在区间内先严格递增后严格递减&#xff08;单峰函数&#xff09;&#xff0c;适合使用三分法求解。 算法原理 三分法核心思想 对于单峰函数&#xff0c;在区…

[Windows] 一键实现重复工作自动化zTasker

zTasker&#xff0c;是一款定时&#xff5c;热键&#xff5c;纯粹的自动化任务神器。它支持超过100种任务类型&#xff0c;包括提醒、关机重启、报时、挡屏休息、文件备份、音量调节、静音等。用户可以通过定时、CPU占用、文件夹监控、网速、快捷键等多种条件触发任务。 简单点…

Docker核心笔记

一、概述 1、架构 Docker容器基于镜像运行,容器共享宿主机的内核,不会加载额外内核,通过Namespaces(环境隔离)和Cgroups(资源控制)实现隔离,Cgroups会限容器使用资源并控制优先级和统计数据。隔离后的容器仅包含应用所需的用户态依赖 2、安装 安装先卸载再安装,使用的yum…

2025年电工杯数学建模B题【垃圾运输】原创论文分享

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025年电工杯数学建模B题【垃圾运输】完整的成品论文。 给大家看一下目录吧&#xff1a; 目录 摘 要&#xff1a; 一、问题重述 二&#xff0e;问题分析 2.1问题一 2.2问题二 2.3问题三 三、模型假设 …

[爬虫知识] IP代理

相关实战案例&#xff1a;[爬虫实战] 代理爬取&#xff1a;小白也能看懂怎么用代理 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 引言&#xff1a;爬虫与IP封锁的攻防战 对网络爬虫而言&#xff0c;遇到的一个较棘手的问题就是封IP&#xff1a;请…

计算机视觉---YOLOv1

YOLOv1深度解析&#xff1a;单阶段目标检测的开山之作 一、YOLOv1概述 提出背景&#xff1a; 2016年由Joseph Redmon等人提出&#xff0c;全称"You Only Look Once"&#xff0c;首次将目标检测视为回归问题&#xff0c;开创单阶段&#xff08;One-Stage&#xff09…

前端学习笔记element-Plus

【element-plus菜单】参数说明&#xff1a; active-text-color"#ffd04b"——激活颜色 background-color"#232323"——背景颜色&#xff08;29,160,176&#xff09; :default-active"$route.path"——配置默认高亮的菜单项 text-color"#f…