mybatisplus中EntityWrapper的常用方法
目录
- EntityWrapper的常用方法
- 粗心遇到的EntityWrapper的一个坑
- 原因
- 解决方案
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","解决");
【mybatisplus中EntityWrapper的常用方法】
粗心遇到的EntityWrapper的一个坑 公司项目框架是SpringBoot为主题,整合了MyBatisPlus的数据库框架,在Service进行简单的单表查询时一般直接使用EntityWrapper的包装类进行查询,比较方便.
但在昨天工作的过程中发现一个查询方法来来回回的出错,查询条件与预期不符,最终发现是一个wrapper中使用addFilterIfNeed时粗心导致的大坑!
Service层查询语句:
EntityWrapper ew=new EntityWrapper(); 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 page = this.selectPage(new Query(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=4ORDER BY TXTIME;
发现问题了吧!
由于addFilterIfNeed只是简单的语句拼接,所以即使我这一句写在了一起,照样给我原样加上去的,所以导致查询逻辑错误,进而引起查询条件失效!
解决方案
解决方案很简单,只要在语句中加上括号即可
.addFilterIfNeed(Util.isEmpty(params.getState()),"(state=1 or state=3 or state=4)")
总结:至此,此次遇到的大坑完整解决,也因此明白EntityWrapper中addFilterIfNeed的实现方式.之前没发现这个问题时来来回回改了好多次,都没有解决问题,直到发现根源!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- MyBatis-Plus工具使用之EntityWrapper解析
- Java中的Unsafe在安全领域的使用总结和复现(实例详解)
- Python|Python 中的对象析构函数__del__ 详情
- Vue中父子组件通信与事件触发的深入讲解
- 关于EntityWrapper的in用法
- Java|Java 中的静态字段和静态方法
- MybatisPlus|MybatisPlus EntityWrapper如何自定义SQL
- Python中range、np.arange和np.linspace的区别
- 市场调研|全球与中国2,5二甲基苯酚市场现状及未来发展趋势
- 每日leetcode——JZ22 链表中倒数最后k个结点