Mybatis-plus 根据条件多个动态or进行嵌套查询
如题,最近有个需求,or语句是动态的,并且需要嵌套与and一起, 需要查询数据sql结构如下
select XXX from tb_xx
where
((column1 =xxx and column2 ) or (column3 =xxx and ...)...)
and id = xx and name = xxx ...
括号里or语句是根据条件来显示不同的,
我们这里可以使用 Mybatis-plus 的nested(Consumer<Param> consumer)
做嵌套(相关使用)。
Consumer的andThen
做动态拼接。代码如下:
拼接 (column1 =xxx and column2 ) or (column3 =xxx and …)…
拼接 (column1 =xxx and column2 ) or (column3 =xxx and ...)...
public static Consumer<QueryWrapper<SettleOrderDO>> getOrConsumers(List<SettleOrderStatusMappingEnumV2.WrapperStatusFactor> factors) {Consumer orConsumers = null;for (int i = 0; i < factors.size(); i++) {SettleOrderStatusMappingEnumV2.WrapperStatusFactor factor = factors.get(i);Consumer<QueryWrapper<SettleOrderDO>> consumer = null;if (i != 0) {consumer = settleOrderDOQueryWrapper -> settleOrderDOQueryWrapper.or(settleOrderDOQueryWrapper1 -> settleOrderDOQueryWrapper1.eq(EmptyUtil.isNotNull(factor.getIsAudit()), "audit_flag", factor.getIsAudit()).in(EmptyUtil.isNotEmpty(factor.getInvoiceStatuses()), "settle_invoice_status", factor.getInvoiceStatuses()).in(EmptyUtil.isNotEmpty(factor.getStatuses()), "status", factor.getStatuses()).eq(EmptyUtil.isNotNull(factor.getIsInvoiced()), "is_invoiced", factor.getIsInvoiced()));orConsumers = orConsumers.andThen(consumer);}if (i == 0) {consumer = settleOrderDOQueryWrapper -> settleOrderDOQueryWrapper.or(settleOrderDOQueryWrapper1 -> settleOrderDOQueryWrapper1.eq(EmptyUtil.isNotNull(factor.getIsAudit()), "audit_flag", factor.getIsAudit()).in(EmptyUtil.isNotEmpty(factor.getInvoiceStatuses()), "settle_invoice_status", factor.getInvoiceStatuses()).in(EmptyUtil.isNotEmpty(factor.getStatuses()), "status", factor.getStatuses()).eq(EmptyUtil.isNotNull(factor.getIsInvoiced()), "is_invoiced", factor.getIsInvoiced()));orConsumers = consumer;}}return orConsumers;}
嵌套
public IPage<SettleOrderDO> getPageByVO2(SettleOrderQueryVO query, Integer pageNum, Integer pageSize, Consumer<QueryWrapper<SettleOrderDO>> paramConsumers) {QueryWrapper<SettleOrderDO> queryWrapper = new QueryWrapper<>();if (paramConsumers != null) {queryWrapper.nested(paramConsumers); 嵌套}queryWrapper.eq(EmptyUtil.isNotNull(query.getOptionType()), "option_type", query.getOptionType()).eq(EmptyUtil.isNotEmpty(query.getPayeeMerchant()), "payee_merchant", query.getPayeeMerchant()).eq(EmptyUtil.isNotEmpty(query.getPayeeMerchantName()), "payee_merchant_name", query.getPayeeMerchantName());return this.page(new MyPage<SettleOrderDO>(pageNum, pageSize), queryWrapper);
}
知识点:Consumer
or(Consumer<Param> consumer) 、Children or()、nested(Consumer<Param> consumer)
Consumer接口不清楚的可以看一下我之前的文章
多总结,多学习 这样就不用加晚班。
Mybatis-plus 根据条件多个动态or进行嵌套查询相关推荐
- java回顾:MyBatis参数、sql片段、动态sql、高级查询
目录 一.MyBatis参数 SqlSessiong工具类 1.映射文件配置-入参 1.1 parameterType入参 1.2 单个入参,变量名任意定义: 1.3 多个入参,解决方案: 1.4 p ...
- Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信 ...
- 【MyBatis框架】mapper配置文件-关于动态sql
动态sql 1.什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 2.需求 用户信息综合查询列表和用户信息查询列表总数这两个statem ...
- 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询
目录 Mybatis 复杂映射&配置文件深入 一 Mybatis高级查询 1.1 ResutlMap属性 1.2 多条件查询(三种) 1.3 模糊查询 二 Mybatis映射文件深入 2.1 ...
- Mybatis学习日记(四)——动态SQL第一部分
Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...
- java中动态查询条件,Java实现动态添加查询条件
今天遇到一个问题,就是需要根据前端页面发送的条件查询数据库记录,但是前端发送的条件是不确定的.如果使用mybatis的xml方法可以使用if标签灵活的添加判断条件,但是现在我使用的就是单纯的sql. ...
- jpa mysql sql分页查询语句_JPA多条件复杂SQL动态分页查询功能
概述 ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式. 环境 spring ...
- MYBATIS 根据IN条件查询时,数据只查第一个的问题(字符串被截断......)
先说说我遇到的问题吧: 表student有如下数据, 我想查出来stu_id in (1,2,3)的数据 mybatis代码如下: 1 2 3 <SELECT id="queryMed ...
- mybatis按datetime条件查询,参数为时间戳时
mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...
最新文章
- Brian 的 Perl 问题之万能指南
- 在PostgreSQL命令行psql里格式化输出json字段
- 树莓派:在ubuntu20-server安装和卸载桌面
- 粒子滤波Matlab示例
- spring cloud教程之使用spring boot创建一个应用
- Windows 自动登陆的简单方法
- csharp为何不流行_【经营】做餐饮,算好加减法,你不赚谁赚
- boost::coroutine2模块实现解析器的测试程序
- mysql架构 视频_企业常见MySQL架构应用实战(高可用集群系统+调优经验)视频课程...
- 正确使用招呼语、称呼语_5
- 软件定义网络(Software Defined Network )
- VI命令详解(大全)
- .net通用CMS快速开发框架——问题:Dapper通用的多表联合分页查询怎么破?
- SQL语句BETWEEN
- Java JSON解析教程
- 【认知无线网络】认知无线网络基础知识学习
- arduino无线下载
- 看山聊 Java:检查日期字符串是否合法
- 汇编实验——乐曲程序(两只老虎)
- C#窗体Click事件没反应