SpringJPA 做分页条件查询
前言:
相信小伙伴们的项目很多都用到SpringJPA框架的吧,对于单表的增删改查利用jpa是很方便的,但是对于条件查询并且分页 是不是很多小伙伴不经常写到. 今天我整理了一下在这里分享一下.
话不多说直接上代码:
Controller:
@RestController
public class ProductInstanceController {@Autowiredprivate ProductInstanceService productInstanceService;@PostMapping("page-find-instance")public PageInfoVO<ProductInst> pageFindInstance(@RequestBody ProductInstParams productInstParams) {return productInstanceService.pageFindInstance(productInstParams);}}
Service:
@Service
public class ProductInstanceService {@Autowiredprivate ProductInstRepository productInstRepository;public PageInfoVO<ProductInst> pageFindInstance(ProductInstParams productInstParams) {Sort.Direction direction = Sort.Direction.DESC;//创建一个Pageable对象,其中包含了请求的页码(productInstParams.getPageNo()),每页大小(productInstParams.getPageSize()),排序规则以及排序字段名。Pageable pageable = PageRequest.of(productInstParams.getPageNo(), productInstParams.getPageSize(), direction, "createdTime");//将传入的字符串类型的开始日期(startDate)和结束日期(endDate)转换成Date类型Date start = DateUtil.parseUTC(productInstParams.getStartDate());Date end = DateUtil.parseUTC(productInstParams.getEndDate());//执行JPA分页查询:Page<ProductInst> productInstPage = productInstRepository.findAll((root, query, criteriaBuilder) -> {//初始化一个ArrayList<Predicate>,存储多个谓词条件,这些条件最终会被组合成一个逻辑与(AND)表达式List<Predicate> predicatesAndList = new ArrayList<>();// deleted = 'true'if (null != productInstParams.getIsDeleted()) {predicatesAndList.add(criteriaBuilder.equal(root.get("deleted").as(Boolean.class), productInstParams.getIsDeleted()));}// name like %name%if (StringUtils.isNotBlank(productInstParams.getName())) {predicatesAndList.add(criteriaBuilder.like(root.get("name").as(String.class), productInstParams.getName()));}// runStatus = "运行中"if (StringUtils.isNotBlank(productInstParams.getRunStatus())) {predicatesAndList.add(criteriaBuilder.equal(root.get("runStatus").as(String.class), productInstParams.getRunStatus()));}// createdTime >= startif (!Objects.isNull(start)) {predicatesAndList.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createdTime").as(Date.class), start));}// createdTime <= endif (!Objects.isNull(end)) {predicatesAndList.add(criteriaBuilder.lessThanOrEqualTo(root.get("createdTime").as(Date.class), end));}// id in ('1','2')if (!CollectionUtils.isEmpty(productInstParams.getIds())) {CriteriaBuilder.In<String> in = criteriaBuilder.in(root.get("id").as(String.class));productInstParams.getIds().forEach(in::value);predicatesAndList.add(in);}Predicate andPredicate = criteriaBuilder.and(predicatesAndList.toArray(new Predicate[predicatesAndList.size()]));query.where(andPredicate);return query.getRestriction();}, pageable);return PageUtil.generatePageInfoVO(productInstPage);}
}
解释:
jpa分页查询调的方法是:
Page findAll(@Nullable Specification spec, Pageable pageable);
该方法接受两个参数:
一个是 Specification 对象,用于构建复杂的查询条件;
另一个是之前创建的pageable对象,用于指定分页及排序信息。
点进去可以直接看到

下面我再解释一下这行代码
criteriaBuilder.equal(root.get("runStatus").as(String.class), productInstParams.getRunStatus());
1. criteriaBuilder 是javax.persistence.criteria.CriteriaBuilder的一个实例,它是用来构建JPQL查询条件的对象。
2. root 是代表查询主表的Root对象,它指向ProductInst实体类对应的数据库表。
3. root.get(“runStatus”) 表示获取ProductInst实体类中的runStatus属性(注意:这地方写的不是数据库的字段,我数据库的字段是:run_status)。这个方法返回的是一个Path<未知类型>对象,表示runStatus字段在查询路径上的位置。
4. .as(String.class) 是类型转换,确保runStatus被视为String类型,因为在数据库中它可能被映射为VARCHAR或者其他文本类型字段。
5. productInstParams.getRunStatus() 获取传入参数对象productInstParams中的runStatus属性值,这是一个待匹配的实际值。
综上所述:这段代码对应的sql
WHERE run_status = 'XXXX'
Repository:
@Repository
public interface ProductInstRepository extends JpaRepository<ProductInst, String>, JpaSpecificationExecutor<ProductInst> {}
PageInfoVO:
package com.king.alice.common.base;import lombok.Getter;
import lombok.Setter;import java.util.List;/*** @Author wlt* @Description 分页数据中的元素* @Date 2022/8/26**/
@Getter
@Setter
public class PageInfoVO<T> extends BaseVO{private static final long serialVersionUID = -3542944936096780651L;/*** 总记录数*/private long total;/*** 当前页*/private int pageNum;/*** 每页的数量*/private int pageSize;/*** 结果集*/private List<T> list;
}
PageUtil:
package com.king.alice.common.util;import com.king.alice.common.base.PageInfoVO;
import org.springframework.data.domain.Page;/*** @author 大魔王* @description:* @date 2024/3/22 11:02*/
public class PageUtil {/*** 根据Page对象生成PageInfoVO** @param page Page包装对象* @return PageDto 对象*/@SuppressWarnings({"unchecked"})public static <T> PageInfoVO<T> generatePageInfoVO(Page page) {PageInfoVO result = new PageInfoVO();result.setPageNum(page.getNumber() + 1);result.setPageSize(page.getPageable().getPageSize());result.setTotal(page.getTotalElements());result.setList(page.getContent());return result;}
}
ProductInstParams:
package com.king.alice.manage.instance.params;import lombok.Data;import java.util.List;/*** @author 大魔王* @description: TODO* @date 2024/3/21 16:56*/
@Data
public class ProductInstParams {/*** 当前页*/private int pageNo;/*** 每页的数量*/private int pageSize;/*** 名字*/private List<String> ids;/*** 名字*/private String name;/*** 运行状态*/private String runStatus;private String startDate;private String endDate;private Boolean isDeleted;
}
测试:

响应结果:
控制台打印sql:


完美实现!
相关文章:
SpringJPA 做分页条件查询
前言: 相信小伙伴们的项目很多都用到SpringJPA框架的吧,对于单表的增删改查利用jpa是很方便的,但是对于条件查询并且分页 是不是很多小伙伴不经常写到. 今天我整理了一下在这里分享一下. 话不多说直接上代码: Controller: RestController public class ProductInstanceContr…...
[Java基础揉碎]单例模式
目录 什么是设计模式 什么是单例模式 饿汉式与懒汉式 饿汉式vs懒汉式 懒汉式存在线程安全问题 什么是设计模式 1.静态方法和属性的经典使用 2.设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、 以及解决问题的思考方式。设计模式就像是经典的棋谱&am…...
unity无法使用道路生成插件Road Architect(ctrl和shift无法标点)
切换一下布局就行了。 附:Road Architect教学地址...
Django下载使用、文件介绍
【一】下载并使用 【1】下载框架 (1)注意事项 计算机名称不要出现中文python解释器版本不同可能会出现启动报错项目中所有的文件名称不要出现中文多个项目文件尽量不要嵌套,做到一项一夹 (2)下载 Django属于第三方模块&#…...
Docker进阶:Docker-cpmpose 实现服务弹性伸缩
Docker进阶:Docker-cpmpose 实现服务弹性伸缩 一、Docker Compose基础概念1.1 Docker Compose简介1.2 Docker Compose文件结构 二、弹性伸缩的原理和实现步骤2.1 弹性伸缩原理2.2 实现步骤 三、技术实践案例3.1 场景描述3.2 配置Docker Compose文件3.3 使用 docker-…...
opencv各个模块介绍(2)
Features2D 模块:特征检测和描述子计算模块,包括SIFT、SURF等算法。 Features2D 模块提供了许多用于特征检测和描述子匹配的函数和类,这些函数和类可用于图像特征的提取、匹配和跟踪。 FeatureDetector:特征检测器的基类…...
HTTPS:原理、使用方法及安全威胁
文章目录 一、HTTPS技术原理1.1 主要技术原理1.2 HTTPS的工作过程1.2.1 握手阶段1.2.2 数据传输阶段 1.3 HTTPS的安全性 二、HTTPS使用方法三、HTTPS安全威胁四、总结 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)&am…...
【云开发笔记No.6】腾讯CODING平台
腾讯云很酷的一个应用,现在对于研发一体化,全流程管理,各种工具层出不穷。 云时代用云原生,再加上AI,编码方式真是发生了质的变化。 从前,一个人可以写一个很酷的软件,后来,这变得…...
20.Ubuntu下安装GCC
文章目录 Ubuntu下安装GCC查看官方安装指导错误缺少gmp库缺少32位开发库libcg: error: gengtype-lex.c: No such file or directoryreference 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 Ubuntu下安装GCC 为了支持新的c标准ÿ…...
2.windows ubuntu子系统配置
打开UBuntu后, > wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh #下载conda软件。 > bash Miniconda3-latest-Linux-x86_64.sh #下载完conda后执行这步 > source ~/.bashrc > conda-h #出现一下…...
vscode的一些技巧
技巧1:调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项: “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2:断点 普通断点使…...
JavaEE企业级分布式高级架构师课程
教程介绍 本课程主要面向1-5年及以上工作经验的Java工程师,大纲由IT界知名大牛 — 廖雪峰老师亲自打造,由来自一线大型互联网公司架构师、技术总监授课,内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发…...
c语言函数大全(K开头)
c语言函数大全(K开头) There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave quickly. 函数名…...
高效备考2025年AMC8竞赛:吃透2000-2024年600道真题(免费送题)
我们继续来随机看五道AMC8的真题和解析,根据实践经验,对于想了解或者加AMC8美国数学竞赛的考生来说,吃透AMC8历年真题是备考更加科学、有效的方法之一。 最近有家长朋友问我,现在有哪些类似于奥数的比赛可以参加?我的…...
HTML5和CSS3新特性
Html新增属性 1.新增语义化标签 <header>:头部标签 <nav>:导航标签 <article>:内容标签 <section>:定义文档某个区域 <aside>:侧边栏标签 <footer>:尾部标签 2.…...
Java基础-正则表达式
文章目录 1.基本介绍2.正则底层实现1.matcher.find()完成的任务2.matcher.group(0)分析1.源代码2.解释(不分组)3.解释(分组) 3.总结 3.正则表达式语法1.基本介绍2.元字符的转义符号1.基本介绍2.代码实例 3.字符匹配符1.基本介绍2.…...
构建Pytorch虚拟环境教程
构建PyTorch虚拟环境通常涉及使用诸如Anaconda或venv等工具来管理Python环境,以便在一个独立的空间中安装PyTorch和其他依赖项。以下是使用Anaconda创建PyTorch虚拟环境的步骤(适用于不同操作系统,包括Windows、Linux和MacOS)&…...
uniapp页面嵌套其他页面的实现
功能: 类似于一个drawer,当主页面加载的时候会一并加载url对应的组件,当点击后以drawer形式显示组件里面的内容,可动画。 <navigator url"/pages/my/components/personalMessage" slot"right"><view><di…...
XUbuntu22.04之安装Plantuml(二百二十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
第四周刷题小结
第一天 P1068 [NOIP2009 普及组] 分数线划定 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路: 这个题感觉不难,主要是用到了结构体cmp的自定义排序,但是还是错了一次,就是没注意到题目给的条件。 #include<iostream&g…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
