JPA怎么通过Specification实现复杂查询
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,小编给大家分享一下JPA怎么通过Specification实现复杂查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JPA 通过Specification实现复杂查询JPA中继承Ba
千家信息网最后更新 2025年11月09日JPA怎么通过Specification实现复杂查询
小编给大家分享一下JPA怎么通过Specification实现复杂查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
JPA 通过Specification实现复杂查询
JPA中继承BaseRepo之后,可以使用最基本的增删改查,如果想实现复杂查询,则需要借助Specification来完成这个功能:
下面就简单介绍一下Specification的使用
public void findAll(ConstructPlanPageReqEntity constructPlanPageReqEntity) { Integer pageNum = page.getPageNum(); Integer pageSize = page.getPageSize(); String costType = constructPlanPageReqEntity.getCostType(); String name = constructPlanPageReqEntity.getName(); String planMoneyStart = constructPlanPageReqEntity.getPlanMoneyStart(); String planMoneyEnd = constructPlanPageReqEntity.getPlanMoneyEnd(); String singMoneyEnd = constructPlanPageReqEntity.getSingMoneyEnd(); String signMoneyStart = constructPlanPageReqEntity.getSignMoneyStart(); long projectId = Long.parseLong(constructPlanPageReqEntity.getProjectId()); String status = constructPlanPageReqEntity.getStatus(); //分页 pageNum=pageNum-1; Pageable pageable = PageRequest.of(pageNum, pageSize);//多条件匹配查询 Specification specification= new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) { ArrayList list = new ArrayList<>(); Path costType1 = root.get("costType"); Path name1 = root.get("name"); Path projectId1 = root.get("projectId"); Path 以上代码实现了多条件查询,其中需要重写toPredicate方法,具体参数:
用root.get()获取bean中的数据库对应字段
用criteriaBuilder来组建条件查询语句
上图是criteriaBuilder各种sql符号的方法名,根据需求组建不同的sql语句
criteriaBuilder.and(list.toArray(array))这句是最后定义各个sql查询条件的关系,这里用的and
至此,复杂sql语句就拼接完成,本人对Specification的使用未进行深入研究,个人觉得相对filter Strem的复杂查询来说Specification更繁琐,因此更倾向于通过Strem的复杂查询,这回就不多说了,下次就介绍下如何使用Stream进行复杂查询
spring-data-jpa Specification拼接复杂查询
public PagefindAll(Map params, ServiceItemConsumeStatus serviceItemConsumeStatus,ServiceItemStatus serviceItemStatus, Pageable pageable) { return dao.findAll(spec(serviceItemConsumeStatus, serviceItemStatus, params), pageable); } private Specification spec(final ServiceItemConsumeStatus serviceItemConsumeStatus, final ServiceItemStatus serviceItemStatus, Map params) { Collection filters = SearchFilter.parse(params).values(); final Specification fsp = SearchFilter.spec(filters, ServiceItem.class); Specification sp = new Specification () { public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) { Predicate pred = fsp.toPredicate(root, query, cb); if (ServiceItemConsumeStatus.可消费.equals(serviceItemConsumeStatus)) { pred = cb.and(pred, cb.gt(root.get("countLeft").as(int.class), 0)); } else if (ServiceItemConsumeStatus.消费完毕.equals(serviceItemConsumeStatus)) { pred = cb.and(pred, cb.le(root.get("countLeft").as(int.class), 0)); } if (serviceItemStatus != null) { pred = cb.and(pred, cb.equal(root.get("status"), serviceItemStatus)); } return pred; } }; return sp; }
看完了这篇文章,相信你对"JPA怎么通过Specification实现复杂查询"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
查询
复杂
条件
语句
方法
篇文章
消费
不同
繁琐
上图
个人
代码
倾向
功能
参数
字段
完了
数据
数据库
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
银行软件开发能计入无形资产
网络技术管理员面试
欣悦网络技术工作室
梦奇网络技术6
气滞胃痛广告数据库
张家港中高端服务器市面价
信息网络安全直播
网络安全为大家稿子
国诚互联网科技
网络技术服务有哪些职位
代理服务器验证工具
互联网科技霸主
剑网三 网通三服务器
网络安全公司如何注册
数据库系统的结构划分
省级服务器
网络安全c2等级
iphone的数据库在哪里
全光接入网络技术是什么
北京华为服务器维修调试哪家好
自己写代码怎么发送到服务器
宣城系统软件开发费用
默认数据库端口
ssd硬盘 服务器
网络安全风险管理考评师资格证书
oracle数据库简历
山东软件开发者单位
联不上服务器上电脑
一张图看懂乌镇互联网大会黑科技
sql 排除重复数据库