mybatisplus中EntityWrapper的常用方法
作者:你坚持了吗 发布时间:2022-11-09 21:52:00
EntityWrapper的常用方法
#WHERE (issue_type = ?) AND (status = ? OR status = ? OR status = ?)
EntityWrapper wrapper=new EntityWrapper();
wrapper.eq("issue_type","缺陷").andNew().eq("status","提交").or()
.eq("status","激活").or().eq("status","解决");
粗心遇到的EntityWrapper的一个坑
公司项目框架是SpringBoot为主题,整合了MyBatisPlus的数据库框架,在Service进行简单的单表查询时一般直接使用EntityWrapper的包装类进行查询,比较方便.
但在昨天工作的过程中发现一个查询方法来来回回的出错,查询条件与预期不符,最终发现是一个wrapper中使用addFilterIfNeed时粗心导致的大坑!
Service层查询语句:
EntityWrapper<PayTiXianApplyEntity> ew=new EntityWrapper<PayTiXianApplyEntity>();
ew.eq(Util.isNotEmpty(params.getState()), "STATE", params.getState())
//state不为空,根据state查询
.like(Util.isNotEmpty(params.getTxname()), "TXNAME", params.getTxname())
.eq(Util.isNotEmpty(params.getTxmode()), "TXMODE", params.getTxmode())
.like(Util.isNotEmpty(params.getTxserial()), "TXSERIAL", params.getTxserial())
.addFilterIfNeed(Util.isNotEmpty(txtime), "DATE_FORMAT(TXTIME,'%Y-%m-%d')='" + txtime+"'")
.addFilterIfNeed(Util.isEmpty(params.getState()),"state=1 or state=3 or state=4")
//state为空,查询state为1或2的记录,即出纳人审核通过和没通过的记录
.orderBy("TXTIME", false);
Page<PayTiXianApplyEntity> page = this.selectPage(
new Query<PayTiXianApplyEntity>(params).getPage(),ew);
由于需求是,根据参数不同使用不同的查询条件.state为空时需查询表中所有state符合要求的记录;state不为空,则根据state=参数来查询.
为了省事,所以直接使用了wrapper,其实在MaBatis中使用条件判断语句也是可以的.
原因
原因就出在为了省事,使用wrapper的addFilterIfNeed上.
出错的是这条语句:
.addFilterIfNeed(Util.isEmpty(params.getState()),"state=1 or state=3 or state=4")
由于一开始是直接新建的new EntityWrapper的匿名对象,所以即使是debug也查不出错误.为了看清SQL,我新建了一个对象ew,在debug过程中仔细看他的SQL属性,最后发现了,在执行这条语句时,SQL只是简单的语句拼接.
也就是说,当我state为null时,这条查询的语句是:(不能写完整的语句,部分参数直接用#{}来代替)
SELECT * FROM 表名
WHERE TXNAME like #{txname}
AND TXMODE=#{txmode}
AND TXSERIAL=#{txserial}
AND DATE_FORMAT(TXTIME,'%Y-%m-%d')=#{txtime}
AND state=1 or state=3 or state=4
ORDER BY TXTIME;
发现问题了吧!
由于addFilterIfNeed只是简单的语句拼接,所以即使我这一句写在了一起,照样给我原样加上去的,所以导致查询逻辑错误,进而引起查询条件失效!
解决方案
解决方案很简单,只要在语句中加上括号即可
.addFilterIfNeed(Util.isEmpty(params.getState()),"(state=1 or state=3 or state=4)")
总结:至此,此次遇到的大坑完整解决,也因此明白EntityWrapper中addFilterIfNeed的实现方式.之前没发现这个问题时来来回回改了好多次,都没有解决问题,直到发现根源!
来源:https://www.cnblogs.com/paisen/p/11423012.html


猜你喜欢
- FileStream,顾名思义,文件流。流,是字节流。我的理解是,硬盘上存在一个字节流,内存里也有一个字节流,它们是对应的。程序运行时,我们
- 本文研究的主要是Spring+Junit4进行接口测试的一个相关实例,具体实现代码如下。1.配置pom.xml<dependency&
- 最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如 1.采用色度变换 2.
- Android 媒体库数据更新方法总结在项目中,我们经常要创建个自己的目录,里面存放一些图片啊文件之类,比如:我在SD卡中刚创建了一个文件夹
- 本文实例为大家分享了Android实现接近传感器的具体代码,供大家参考,具体内容如下1.接近传感器检测物体与听筒(手机)的距离,单位是厘米。
- SpringBoot加载application.properties配置文件的坑事情的起因是这样的一次,本人在现场升级程序,升级完成后进行测
- 要获得打印机的状态,应该定义一个联合.enum PrinterStatus { 其他状态= 1, 未知, 空闲
- 本文研究的主要是Java中finally和return的关系,具体介绍和实例如下所示。finally 和 return 关系的总结1.try
- 传感器简单的介绍一下传感器: 就是设备用来感知周边环境变化的硬件。Android中的传感器包含在传感器框架中,属于android.hardw
- 1)页面跳转 直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。 返回带有前缀的字符串:转发:
- Filter过滤器中访问getSession()要进行转化public void doFilter(ServletRequest reque
- 本文实例讲述了Android判断Activity是否在最上层的方法。分享给大家供大家参考,具体如下:private boolean isTo
- 前言现在APP中用到H5页面的越来越多,而如何正确获取WebView的网页title是必须要考虑的。最近做项目的时候,老大让我把之前做的we
- 本文使用SpringBoot结合Redis进行简单的token鉴权。1.简介刚刚换了公司,所以最近有些忙碌,所以一直没有什么产出,最近朋友问
- 本文实例讲述了C#实现程序等待延迟执行的方法。分享给大家供大家参考。具体如下:[System.Runtime.InteropServices
- Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态。Memento模式相
- eclipse 创建 user library 方法1、Window - Preferences - Java - Build Path -
- Android自带的跑马灯效果不太好控制,还必须要满足条件才能有效果,而且速度不受控制。前面我的博客中有一篇就是用Android自带的跑马灯
- 在本文中,我们将看到如何将double转换为int。在Java编程中,您将有一个double原语值(例如82.14),但是要执行进一步的操作
- maven3 安装:安装 Maven 之前要求先确定你的 JDK 已经安装配置完成。Maven是 Apache 下的一个项目,目前最新版本是