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

标签:mybatisplus,EntityWrapper
0
投稿

猜你喜欢

  • Maven添加Tomcat插件实现热部署代码实例

    2021-12-09 02:03:49
  • El表达式使用问题javax.el.ELException:Failed to parse the expression的解决方式

    2023-11-24 12:47:13
  • 使用Java桥接模式打破继承束缚优雅实现多维度变化

    2023-08-23 09:00:34
  • 通俗易通讲解Android蓝牙键值适配

    2022-06-19 07:50:34
  • 不使用他人jar包情况下优雅的进行dubbo调用详解

    2022-04-20 11:43:46
  • VS Code开发React-Native及Flutter 开启无线局域网安卓真机调试问题

    2022-04-05 18:32:06
  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)

    2022-11-14 18:37:22
  • 基于Spring Boot应用ApplicationEvent案例场景

    2023-08-17 22:38:12
  • C#实现用于操作wav声音文件的类实例

    2021-08-15 22:06:25
  • java组件fileupload文件上传demo

    2022-09-14 11:00:45
  • Netty分布式ByteBuf使用的回收逻辑剖析

    2023-07-18 23:26:26
  • SpringBoot搭建go-cqhttp机器人的方法实现

    2022-11-17 23:58:40
  • Android使用animator实现fragment的3D翻转效果

    2021-10-12 06:20:42
  • Android下拉刷新控件SwipeRefreshLayout源码解析

    2023-04-03 20:42:16
  • Java线程创建的四种方式总结

    2023-10-29 19:36:03
  • 浅谈一下Java中的悲观锁和乐观锁

    2023-08-12 05:54:27
  • c++中vector<int>和vector<int*>的用法及区别

    2023-03-28 02:29:37
  • C语言实现超市计价收款系统

    2021-08-21 17:56:47
  • java8 集合之Stack详解及实例

    2023-08-02 16:04:07
  • Android源代码仓库及其管理工具Repo分析详解

    2021-09-01 12:16:18
  • asp之家 软件编程 m.aspxhome.com