如题,最近有个需求,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进行嵌套查询相关推荐

  1. java回顾:MyBatis参数、sql片段、动态sql、高级查询

    目录 一.MyBatis参数 SqlSessiong工具类 1.映射文件配置-入参 1.1 parameterType入参 1.2 单个入参,变量名任意定义: 1.3 多个入参,解决方案: 1.4 p ...

  2. Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql

    mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信 ...

  3. 【MyBatis框架】mapper配置文件-关于动态sql

    动态sql 1.什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 2.需求 用户信息综合查询列表和用户信息查询列表总数这两个statem ...

  4. 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询

    目录 Mybatis 复杂映射&配置文件深入 一 Mybatis高级查询 1.1 ResutlMap属性 1.2 多条件查询(三种) 1.3 模糊查询 二 Mybatis映射文件深入 2.1 ...

  5. Mybatis学习日记(四)——动态SQL第一部分

    Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...

  6. java中动态查询条件,Java实现动态添加查询条件

    今天遇到一个问题,就是需要根据前端页面发送的条件查询数据库记录,但是前端发送的条件是不确定的.如果使用mybatis的xml方法可以使用if标签灵活的添加判断条件,但是现在我使用的就是单纯的sql. ...

  7. jpa mysql sql分页查询语句_JPA多条件复杂SQL动态分页查询功能

    概述 ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式. 环境 spring ...

  8. MYBATIS 根据IN条件查询时,数据只查第一个的问题(字符串被截断......)

    先说说我遇到的问题吧: 表student有如下数据, 我想查出来stu_id in (1,2,3)的数据 mybatis代码如下: 1 2 3 <SELECT id="queryMed ...

  9. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

最新文章

  1. Brian 的 Perl 问题之万能指南
  2. 在PostgreSQL命令行psql里格式化输出json字段
  3. 树莓派:在ubuntu20-server安装和卸载桌面
  4. 粒子滤波Matlab示例
  5. spring cloud教程之使用spring boot创建一个应用
  6. Windows 自动登陆的简单方法
  7. csharp为何不流行_【经营】做餐饮,算好加减法,你不赚谁赚
  8. boost::coroutine2模块实现解析器的测试程序
  9. mysql架构 视频_企业常见MySQL架构应用实战(高可用集群系统+调优经验)视频课程...
  10. 正确使用招呼语、称呼语_5
  11. 软件定义网络(Software Defined Network )
  12. VI命令详解(大全)
  13. .net通用CMS快速开发框架——问题:Dapper通用的多表联合分页查询怎么破?
  14. SQL语句BETWEEN
  15. Java JSON解析教程
  16. 【认知无线网络】认知无线网络基础知识学习
  17. arduino无线下载
  18. 看山聊 Java:检查日期字符串是否合法
  19. 汇编实验——乐曲程序(两只老虎)
  20. C#窗体Click事件没反应

热门文章

  1. Linux 使用for循环结构
  2. 冷月手撕408之操作系统(5)-进程概述
  3. inital,inherit,unset
  4. 蓝桥杯--封印之门( Floyd算法)
  5. 截止2010年3月25日的流量统计
  6. 我的自白 —— 未来的期待
  7. 艾永亮:如何“睡”出一只11亿美元的独角兽?
  8. Oracle的新特性Recyclebin回收站
  9. python -- 面向对象三大特性
  10. 傲慢与偏见之 - 山寨与创新