使用Predicate进行多条件查询包含and 、like、关键字搜索等方法

MybatisPlus条件查询深度解析:从基础构造到复杂场景实战 在Java持久层开发中,ORM框架通过将数据库操作映射为面向对象的方法,极大地提升了开发效率与代码可维护性。其核心原理在于抽象SQL构建过程,实现类型安全的查询条件组装,从而避免传统方式中字符串拼接带来的错误与安全风险。这一技术价值在于简化数据访问层代码,统一查询规范,并降低数据库访问的复杂度。在应用场景上,无论是简单的CRUD操作,还是包含动态条件、多表关联与高性能分页的复杂业务查询,都需要一套清晰、强大的查询构造机制。MybatisPlus作为MyBatis的增强工具,其条件构造器正是为此而生,它通过Q 阅读详情
 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;
    }

MyBatis-Plus QueryWrapper动态查询:从原理到实战避坑指南 动态查询是后端开发中处理复杂、多变数据检索需求的核心技术,其原理在于根据运行时条件动态构建SQL语句的WHERE部分,从而避免硬编码和繁琐的字符串拼接。这项技术的核心价值在于提升代码的灵活性、安全性与可维护性,通过声明式编程模型将查询意图清晰表达。在Java生态中,MyBatis-Plus框架的QueryWrapper组件是实现动态查询的典型方案,广泛应用于管理后台筛选、报表查询等需要支持多条件组合检索的场景。本文聚焦于QueryWrapper,深入解析其Lambda表达式与条件构造器的使用,并针对动态查询 阅读详情

相关推荐

从DWS到设备树:MTK平台LK阶段GPIO初始化的隐秘路径与调试实战

本文深入探讨了MTK平台LK阶段GPIO初始化的完整流程,揭示了从DWS配置到设备树生成的隐秘转换路径。通过分析MT6768等平台的启动框架,提供了针对preloader到LK阶段GPIO初始化异常的实战调试方法与最佳实践,帮助开发者有效解决硬件与软件配置不匹配的常见问题。

h9j8k7l6m5n的博客 1003

springboot jpa 使用Predicate进行in条件查询

if (list != null && list.size() > 0){ Expression<Long> exp = root.<Long>get("xxx"); predicateList.add(exp.in(list)); }

wangjw.bug 6140

立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输至原子云

本文详细介绍了如何使用立创·庐山派-K230-CanMV开发板,通过ATK-ESP8266 WIFI模块实现图像识别数据的无线传输至原子云平台。内容包括硬件连接、软件环境搭建、AT指令控制、原子云连接及数据上传的全过程,并提供了实用的调试技巧和常见问题解决方案,为物联网应用开发提供了完整实践指南。

potato的博客 743

JPA各种查询+sql查询分页数据偏移操作

JPA各种查询+数据偏移

qq_51711350的博客 502

国产数据库PolarDB-X实战:5分钟快速搭建本地开发环境(附Docker一键部署脚本)

本文提供了一份详尽的国产分布式数据库PolarDB-X本地开发环境搭建指南。通过Docker Compose一键部署脚本,开发者可在5分钟内快速启动一个功能完整的PolarDB-X实例,涵盖环境准备、脚本解析、连接验证及日常维护,极大简化了国产数据库的入门和体验流程。

weixin_29246195的博客 358

树莓派4B保姆级教程:从零配置Python虚拟环境到PySide2开发全流程(含避坑指南)

本文提供树莓派4B上配置Python虚拟环境及PySide2 GUI开发的完整教程。针对armv7l架构的特殊性,详细讲解了从系统准备、虚拟环境创建到PySide2安装的避坑指南,并重点解决了跨平台UI文件处理等常见难题,帮助开发者构建稳定高效的开发环境。

9q8w7e6r5的博客 822

spring data 复杂条件查询, in 语句查询

1、CriteriaQuery 安全查询主语句2、Root 定义查询的From子句中能出现的类型、3、Predicate 过滤条件4、Predicate[] 多个过滤条件代码                                List&lt;Predicate&gt; predicatesList = new ArrayList&lt;Predicate&gt;(); ...

a853929779的博客 1923

【信道编码/Channel Coding】线性分组码

这是本专栏信道编码/Channel Coding的第二站,想对信道编码有一个系统性的认识可以看本专栏的信道编码的整体框架一文。而在本篇文章中,将介绍线性分组码的基本原理。

Tomatomatodo的博客 9245

JPA常用方法

JPA知识点

m0_47943986的博客 3831

FreeCAD MCP实战:用自然语言驱动AI建模,效率提升10倍

MCP(Model Context Protocol)是一种让AI模型调用外部工具和数据的协议标准,通过标准化通信层解决AI与CAD软件之间的交互难题。其原理是向AI暴露工具清单,AI根据自然语言需求自动选择工具并填充参数。在工程实践中,这一技术显著降低了CAD建模门槛,将重复性操作从手动点击转为语音指令,适用于批量零件生成、参数化设计等场景。FreeCAD作为开源CAD,凭借开放的Python API和脚本化能力,成为落地MCP的理想平台。本文基于FreeCAD MCP的实操经验,分享环境搭建、自然语言建

weixin_31188927的博客 325

Amazon Skills:51个AI技能赋能亚马逊运营,从选品到广告全链路分析

在电商运营领域,数据分析和自动化工具正成为提升效率的关键。其核心原理在于将专业经验转化为结构化指令,使AI能够执行标准化流程。这种技术价值体现在降低专业门槛、提升决策效率,尤其适用于亚马逊这类数据驱动的电商平台。通过将选品、关键词研究、FBA费用计算、PPC广告优化等运营框架编码为可执行指令,AI助手能够模拟专家思维进行市场分析。Amazon Skills项目正是这一理念的实践,它提供51个覆盖运营全链路的技能模块,让卖家在自然对话环境中获得专业分析支持,实现从市场研究到利润核算的自动化工作流。

weixin_27134143的博客 1304

Java8 Predicate 函数式接口 实现多条件过滤

需求 给一个集合,找到满足添加的对象,一下条件可能会动态的变化,有时候只需要满足一个,有时候需要满足两个。。。 1、大于。。 2、小于。。 3、是偶数 使用 Predicate完成需求 Predicate主要作用就是输入一个参数,输出一个Boolean值,用于判断这个输入的参数是否满足某个条件 Predicate 接口里面 一个默认方法 ,可以完成多个条件的组合 源码 defaul...

Quella9002的博客 2529

GeoServer下载与安装(详细图文教程)

GeoServer官方版可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。

大剑师兰特的GIS世界 3276

java8 Predicate和Stream 搜索关键字mysql like多字段后 对结果按优先级排序

Predicate 判断 Stream.filter() 过滤数据 //----------------------专家---------------------- // istatus=1 查询条件 order by create_date desc @ApiOperation(value="专家", notes="专家", httpMethod = "GET") @GetMapping...

Talk is cheap. Show me the code. 2106

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框架实现的服务端查询解析和实现介绍。 查询功能是在各种应...

topdeveloperr的博客 6552

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应用开发,值得收藏。

ProcePerch的博客 813

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 源码解析...

weixin_44421461的博客 487

Spring Boot + Querydsl 框架,大大简化复杂查询操作!!

概述 本篇博客主要将介绍的是利用spring query dsl框架实现的服务端查询解析和实现介绍。 查询功能是在各种应用程序里面都有应用,且非常重要的功能。用户直接使用的查询功能往往是在我们做好的UI界面上进行查询,UI会将查询请求发给查询实现的服务器,或者专门负责实现查询的一个组件。市场上有专门做查询的框架,其中比较出名,应用也比较广泛的是elasticsearch。 定义查询请求 对于服务端来说,前端UI发送过来的查询请求必然是按一定规则组织起来的,这样的规则后端必须能够支持和解析。换一种说法就是服务

Java技术栈,分享最主流的Java技术 501

SQL Server LIKE通配符性能原理与索引优化实战

LIKE是SQL中用于字符串模式匹配的基础操作符,其底层并非简单模糊搜索,而是直接影响查询优化器的执行路径选择。理解其SARGable特性、前缀/后缀/中置通配符对索引Seek与Scan的触发机制,是数据库性能调优的关键。结合排序规则(Collation)差异、Unicode字符集处理及ESCAPE转义上下文,可避免线上常见匹配失效与性能雪崩。在电商SKU检索、日志告警、金融流水号校验等场景中,合理运用LIKE配合计算列、逆序索引或全文检索,能将毫秒级响应提升至亚秒级。本文聚焦SQL Server引擎如何解

weixin_30457551的博客 399

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

TARS_的博客 1047

Spring Data -Specification用法和常用查询方法(in,join,equal等)

Spring Data -Specification用法和常用查询方法(in,join,equal等)前言入门例子Repository层常用写法Specification 的用法总结 前言 在这一年里技术更新,从使用Mybatis转为Spring Data...

WGH100817的博客 409

Spring Data -Specification用法和常用查询方法(in,join,equal等)(转)

Spring Data -Specification用法和常用查询方法(in,join,equal等) 前言 入门例子 Repository层常用写法 Specification 的用法 前言 在这一年里技术更新,从使用Mybatis转为Spring Data,总体感受是终于不用在自己写映射了,也可以少写方法和对应字段了。接下来总结在工作中常用的查询方式和方法,例如equal,join,in等。积少成多,在这里只收藏了用过查询与方法(如果方法可以用得更有,有更多的用法和不足之处请

weixin_42769504的博客 795
上一篇: 找不到openjdk-1.8-tools和openjdk-1.8-jconsole
下一篇: nacos的cp和ap原则,服务健康检查
hello_xing
博客等级 码龄8年 1930粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值