Specification<DangerInfoPO> spec = new Specification<DangerInfoPO>() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = getAndPredicateList(cb,criteriaQuery,root,dto);
if(null != dto.getDistrictCode() && dto.getDistrictCode().length > 0) {
list.add(cb.and(root.get("districtCode").in(dto.getDistrictCode())));
}
Predicate[] p = new Predicate[list.size()];
criteriaQuery.where(cb.and(list.toArray(p)));
return criteriaQuery.getRestriction();
}
};
private List<Predicate> getAndPredicateList(CriteriaBuilder criteriaBuilder, CriteriaQuery query,Root root,
DangerInfoSearchDTO dto) {
// 多条件And 查询
List<Predicate> predicateList = new ArrayList<>();
if (ArrayUtils.isNotEmpty(dto.getOrgcode())) {
predicateList.add(root.get(DangerInfoConstants.FIELD_ORG_CODE).in(Arrays.asList(dto.getOrgcode())));
}
//多like模糊查询类似于select * from user where name like '%四%' or name like '%五%'
if (ArrayUtils.isNotEmpty(dto.getDangerTypeCode())) {
String[] dangerTypeCode = dto.getDangerTypeCode();
int length = dangerTypeCode.length;
if (length>0){
List predicateList1 = new ArrayList();
Predicate [] p = new Predicate[length];
for (int i = 0; i <length ; i++) {
predicateList1.add(criteriaBuilder.like(root.get(DangerInfoConstants.FIELD_DANGERTYPE_CODE),pattern(dangerTypeCode[i])));
}
predicateList1.toArray(p);
predicateList.add(criteriaBuilder.or(p));
}
}
if (null != dto.getStartTime() && null != dto.getEndTime()) {
predicateList.add(criteriaBuilder.greaterThanOrEqualTo(root.get(DangerInfoConstants.FIELD_UPDATE_TIME),
dto.getStartTime()));
predicateList.add(criteriaBuilder.lessThanOrEqualTo(root.get(DangerInfoConstants.FIELD_UPDATE_TIME),
dto.getEndTime()));
}
//加上关键词搜索
if(StringUtils.isNotBlank(dto.getKeywords())){
predicateList.add(criteriaBuilder.or(criteriaBuilder.like(root.get(DangerInfoConstants.FIELD_DANGER_NAME),
pattern(dto.getKeywords()),ESCAPE),criteriaBuilder.like(root.get(DangerInfoConstants.FIELD_DANGER_ADDRESS),
pattern(dto.getKeywords()), ESCAPE)));
}
if (ArrayUtils.isNotEmpty(dto.getEngrossArea())) {
Subquery<DangerInfoPO> areaSq = query.subquery(DangerInfoPO.class);
Root<DangerInfoPO> aRoot = areaSq.from(DangerInfoPO.class);
List<Predicate> areaSubList = new ArrayList<>();
for (BigDecimal[] areaArr : dto.getEngrossArea()) {
if (ArrayUtils.isNotEmpty(areaArr) && areaArr.length > 1) {
if (areaArr[0] != null && areaArr[1] == null) {
areaSubList.add(criteriaBuilder.greaterThanOrEqualTo(
root.get(DangerInfoConstants.FIELD_ENGROSSAREA), areaArr[0]));
} else if (areaArr[0] == null && areaArr[1] != null) {
areaSubList.add(criteriaBuilder.lessThanOrEqualTo(
root.get(DangerInfoConstants.FIELD_ENGROSSAREA), areaArr[1]));
} else {
areaSubList.add(criteriaBuilder.between(root.get(DangerInfoConstants.FIELD_ENGROSSAREA),
areaArr[0], areaArr[1]));
}
}
}
Predicate areaSubPredicate = criteriaBuilder.or(areaSubList.toArray(new Predicate[areaSubList.size()]));
areaSq.select(aRoot.<DangerInfoPO>get(DangerInfoConstants.FIELD_DANGER_ID)).where(areaSubPredicate);
predicateList.add(root.get(DangerInfoConstants.FIELD_DANGER_ID).in(areaSq));
}
if (ArrayUtils.isNotEmpty(dto.getMaxPersonNum())) {
Subquery<DangerInfoPO> numSq = query.subquery(DangerInfoPO.class);
Root<DangerInfoPO> nRoot = numSq.from(DangerInfoPO.class);
List<Predicate> numSubList = new ArrayList<>();
for (Integer[] maxPerson : dto.getMaxPersonNum()) {
if (ArrayUtils.isNotEmpty(maxPerson) && maxPerson.length > 1) {
if (maxPerson[0] != null && maxPerson[1] == null) {
numSubList.add(criteriaBuilder.greaterThanOrEqualTo(
root.get(DangerInfoConstants.FIELD_MAXPERSONNUM), maxPerson[0]));
} else if (maxPerson[0] == null && maxPerson[1] != null) {
numSubList.add(criteriaBuilder.lessThanOrEqualTo(
root.get(DangerInfoConstants.FIELD_MAXPERSONNUM), maxPerson[1]));
} else {
numSubList.add(criteriaBuilder.between(root.get(DangerInfoConstants.FIELD_MAXPERSONNUM),
maxPerson[0], maxPerson[1]));
}
}
}
Predicate areaSubPredicate = criteriaBuilder.or(numSubList.toArray(new Predicate[numSubList.size()]));
numSq.select(nRoot.<DangerInfoPO>get(DangerInfoConstants.FIELD_DANGER_ID)).where(areaSubPredicate);
predicateList.add(root.get(DangerInfoConstants.FIELD_DANGER_ID).in(numSq));
}
return predicateList;
}
相关推荐
从DWS到设备树:MTK平台LK阶段GPIO初始化的隐秘路径与调试实战
本文深入探讨了MTK平台LK阶段GPIO初始化的完整流程,揭示了从DWS配置到设备树生成的隐秘转换路径。通过分析MT6768等平台的启动框架,提供了针对preloader到LK阶段GPIO初始化异常的实战调试方法与最佳实践,帮助开发者有效解决硬件与软件配置不匹配的常见问题。
springboot jpa 使用Predicate进行in条件查询
if (list != null && list.size() > 0){ Expression<Long> exp = root.<Long>get("xxx"); predicateList.add(exp.in(list)); }
立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输至原子云
本文详细介绍了如何使用立创·庐山派-K230-CanMV开发板,通过ATK-ESP8266 WIFI模块实现图像识别数据的无线传输至原子云平台。内容包括硬件连接、软件环境搭建、AT指令控制、原子云连接及数据上传的全过程,并提供了实用的调试技巧和常见问题解决方案,为物联网应用开发提供了完整实践指南。
JPA各种查询+sql查询分页数据偏移操作
JPA各种查询+数据偏移
国产数据库PolarDB-X实战:5分钟快速搭建本地开发环境(附Docker一键部署脚本)
本文提供了一份详尽的国产分布式数据库PolarDB-X本地开发环境搭建指南。通过Docker Compose一键部署脚本,开发者可在5分钟内快速启动一个功能完整的PolarDB-X实例,涵盖环境准备、脚本解析、连接验证及日常维护,极大简化了国产数据库的入门和体验流程。
树莓派4B保姆级教程:从零配置Python虚拟环境到PySide2开发全流程(含避坑指南)
本文提供树莓派4B上配置Python虚拟环境及PySide2 GUI开发的完整教程。针对armv7l架构的特殊性,详细讲解了从系统准备、虚拟环境创建到PySide2安装的避坑指南,并重点解决了跨平台UI文件处理等常见难题,帮助开发者构建稳定高效的开发环境。
spring data 复杂条件查询, in 语句查询
1、CriteriaQuery 安全查询主语句2、Root 定义查询的From子句中能出现的类型、3、Predicate 过滤条件4、Predicate[] 多个过滤条件代码 List<Predicate> predicatesList = new ArrayList<Predicate>(); ...
【信道编码/Channel Coding】线性分组码
这是本专栏信道编码/Channel Coding的第二站,想对信道编码有一个系统性的认识可以看本专栏的信道编码的整体框架一文。而在本篇文章中,将介绍线性分组码的基本原理。
JPA常用方法
JPA知识点
FreeCAD MCP实战:用自然语言驱动AI建模,效率提升10倍
MCP(Model Context Protocol)是一种让AI模型调用外部工具和数据的协议标准,通过标准化通信层解决AI与CAD软件之间的交互难题。其原理是向AI暴露工具清单,AI根据自然语言需求自动选择工具并填充参数。在工程实践中,这一技术显著降低了CAD建模门槛,将重复性操作从手动点击转为语音指令,适用于批量零件生成、参数化设计等场景。FreeCAD作为开源CAD,凭借开放的Python API和脚本化能力,成为落地MCP的理想平台。本文基于FreeCAD MCP的实操经验,分享环境搭建、自然语言建
Amazon Skills:51个AI技能赋能亚马逊运营,从选品到广告全链路分析
在电商运营领域,数据分析和自动化工具正成为提升效率的关键。其核心原理在于将专业经验转化为结构化指令,使AI能够执行标准化流程。这种技术价值体现在降低专业门槛、提升决策效率,尤其适用于亚马逊这类数据驱动的电商平台。通过将选品、关键词研究、FBA费用计算、PPC广告优化等运营框架编码为可执行指令,AI助手能够模拟专家思维进行市场分析。Amazon Skills项目正是这一理念的实践,它提供51个覆盖运营全链路的技能模块,让卖家在自然对话环境中获得专业分析支持,实现从市场研究到利润核算的自动化工作流。
Java8 Predicate 函数式接口 实现多条件过滤
需求 给一个集合,找到满足添加的对象,一下条件可能会动态的变化,有时候只需要满足一个,有时候需要满足两个。。。 1、大于。。 2、小于。。 3、是偶数 使用 Predicate完成需求 Predicate主要作用就是输入一个参数,输出一个Boolean值,用于判断这个输入的参数是否满足某个条件 Predicate 接口里面 一个默认方法 ,可以完成多个条件的组合 源码 defaul...
GeoServer下载与安装(详细图文教程)
GeoServer官方版可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。
java8 Predicate和Stream 搜索关键字mysql like多字段后 对结果按优先级排序
Predicate 判断 Stream.filter() 过滤数据 //----------------------专家---------------------- // istatus=1 查询条件 order by create_date desc @ApiOperation(value="专家", notes="专家", httpMethod = "GET") @GetMapping...
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
使用spring data Querydsl 实现动态查询功能
Table of Contents 概述 定义查询请求 google-like查询 特定字段的类sql查询 使用Spring DataQuerydsl 利用Spring Query DSL实现动态查询 实现过程中的难题 主表包含多个子表数据时的AND查询 概述 本篇博客主要将介绍的是利用spring query dsl框架实现的服务端查询解析和实现介绍。 查询功能是在各种应...
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
Spring Data JPA多条件查询实战(Specification深度解析与性能优化)
掌握Spring Data JPA多条件查询Specification,轻松应对复杂动态查询场景。详解Predicate组合、Criteria API用法及性能优化技巧,提升查询效率与代码可维护性,适用于企业级Java应用开发,值得收藏。
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
SpringBoot+Querydsl 框架,大大简化复杂查询操作
点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析...
Spring Boot + Querydsl 框架,大大简化复杂查询操作!!
概述 本篇博客主要将介绍的是利用spring query dsl框架实现的服务端查询解析和实现介绍。 查询功能是在各种应用程序里面都有应用,且非常重要的功能。用户直接使用的查询功能往往是在我们做好的UI界面上进行查询,UI会将查询请求发给查询实现的服务器,或者专门负责实现查询的一个组件。市场上有专门做查询的框架,其中比较出名,应用也比较广泛的是elasticsearch。 定义查询请求 对于服务端来说,前端UI发送过来的查询请求必然是按一定规则组织起来的,这样的规则后端必须能够支持和解析。换一种说法就是服务
SQL Server LIKE通配符性能原理与索引优化实战
LIKE是SQL中用于字符串模式匹配的基础操作符,其底层并非简单模糊搜索,而是直接影响查询优化器的执行路径选择。理解其SARGable特性、前缀/后缀/中置通配符对索引Seek与Scan的触发机制,是数据库性能调优的关键。结合排序规则(Collation)差异、Unicode字符集处理及ESCAPE转义上下文,可避免线上常见匹配失效与性能雪崩。在电商SKU检索、日志告警、金融流水号校验等场景中,合理运用LIKE配合计算列、逆序索引或全文检索,能将毫秒级响应提升至亚秒级。本文聚焦SQL Server引擎如何解
spring data jpa(四)封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE, NEQ)
package com.vanhr.hro.util; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Maps; /** * @Auther: CHENGKEDONG * @Date: 2019/1/16 13:38 * @Description: */ public class Sea
Spring Data -Specification用法和常用查询方法(in,join,equal等)
Spring Data -Specification用法和常用查询方法(in,join,equal等)前言入门例子Repository层常用写法Specification 的用法总结 前言 在这一年里技术更新,从使用Mybatis转为Spring Data...
Spring Data -Specification用法和常用查询方法(in,join,equal等)(转)
Spring Data -Specification用法和常用查询方法(in,join,equal等) 前言 入门例子 Repository层常用写法 Specification 的用法 前言 在这一年里技术更新,从使用Mybatis转为Spring Data,总体感受是终于不用在自己写映射了,也可以少写方法和对应字段了。接下来总结在工作中常用的查询方式和方法,例如equal,join,in等。积少成多,在这里只收藏了用过查询与方法(如果方法可以用得更有,有更多的用法和不足之处请
1003



被折叠的 条评论
为什么被折叠?



