mybatisplus中EntityWrapper的常用方法

 更新时间:2022年03月22日 11:03:09   作者:你坚持了吗  
这篇文章主要介绍了mybatisplus中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","解决");

粗心遇到的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的实现方式.之前没发现这个问题时来来回回改了好多次,都没有解决问题,直到发现根源!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 垃圾回收机制详解(动力节点Java学院整理)

    Java 垃圾回收机制详解(动力节点Java学院整理)

    在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用对象的内存,可能会导致内存的耗尽,所以垃圾回收机制回收的是内存。下面通过本文给大家详细介绍java垃圾回收机制,一起学习吧
    2017-02-02
  • Java CAS底层实现原理实例详解

    Java CAS底层实现原理实例详解

    这篇文章主要介绍了Java CAS底层实现原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • spring bean.xml文件p标签使用报错的解决

    spring bean.xml文件p标签使用报错的解决

    这篇文章主要介绍了spring bean.xml文件p标签使用报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 解决IDEA报错java无效的目标发行版:22

    解决IDEA报错java无效的目标发行版:22

    在使用IDEA编译项目时,可能会遇到JDK版本不一致的错误,这篇文章主要介绍了解决IDEA报错java无效的目标发行版:22的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • 全面解析Java设计模式之单例模式

    全面解析Java设计模式之单例模式

    这篇文章主要帮助大家全面解析Java设计模式之单例模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java求素数和最大公约数的简单代码示例

    Java求素数和最大公约数的简单代码示例

    这篇文章主要介绍了Java求素数和最大公约数的简单代码示例,其中作者创建的Fraction类可以用来进行各种分数运算,需要的朋友可以参考下
    2015-09-09
  • 使用Idea连接MySQL的详细步骤总结

    使用Idea连接MySQL的详细步骤总结

    今天给大家带来的是关于IDEA连接数据库的问题,文章围绕着使用Idea连接MySQL的详细步骤展开,文中有非常详细的介绍及图文示例,需要的朋友可以参考下
    2021-06-06
  • java数据结构之搜索二叉树

    java数据结构之搜索二叉树

    这篇文章主要为大家详细介绍了java数据结构之搜索二叉树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Mybatis in条件传参的三种实现方式(直接$,List,[])

    Mybatis in条件传参的三种实现方式(直接$,List,[])

    这篇文章主要介绍了Mybatis in条件传参的三种实现方式(直接$,List,[]),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java 静态数据初始化的示例代码

    Java 静态数据初始化的示例代码

    这篇文章主要介绍了Java 静态数据初始化的示例代码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09

最新评论