我的记录-今日粗心遇到的EntityWrapper的一个坑

2022年05月12日 阅读数:3
这篇文章主要向大家介绍我的记录-今日粗心遇到的EntityWrapper的一个坑,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

我的记录-今日粗心遇到的EntityWrapper的一个坑

问题

公司项目框架是SpringBoot为主题,整合了MyBatisPlus的数据库框架,在Service进行简单的单表查询时通常直接使用EntityWrapper的包装类进行查询,比较方便.
但在昨天工做的过程当中发现一个查询方法来来回回的出错,查询条件与预期不符,最终发现是一个wrapper中使用addFilterIfNeed时粗心致使的大坑!web

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中使用条件判断语句也是能够的.app

缘由

缘由就出在为了省事,使用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时,这条查询的语句是:(不能写完整的语句,部分参数直接用#{}来代替)svg

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只是简单的语句拼接,因此即便我这一句写在了一块儿,照样给我原样加上去的,因此致使查询逻辑错误,进而引发查询条件失效!this

解决方案

解决方案很简单,只要在语句中加上括号便可debug

.addFilterIfNeed(Util.isEmpty(params.getState()),"(state=1 or state=3 or state=4)")

总结

至此,这次遇到的大坑完整解决,也所以明白EntityWrapper中addFilterIfNeed的实现方式.以前没发现这个问题时来来回回改了好屡次,都没有解决问题,直到发现根源!
写一篇博客记录.code