好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mybatisplus中EntityWrapper的常用方法

EntityWrapper的常用方法

?

1

2

3

4

# 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层查询语句:

?

1

2

3

4

5

6

7

8

9

10

11

12

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上.

出错的是这条语句:

?

1

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

由于一开始是直接新建的new EntityWrapper的匿名对象,所以即使是debug也查不出错误.为了看清SQL,我新建了一个对象ew,在debug过程中仔细看他的SQL属性,最后发现了,在执行这条语句时,SQL只是简单的语句拼接.

也就是说,当我state为null时,这条查询的语句是:(不能写完整的语句,部分参数直接用#{}来代替)

?

1

2

3

4

5

6

7

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

解决方案

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

?

1

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

总结:至此,此次遇到的大坑完整解决,也因此明白EntityWrapper中addFilterIfNeed的实现方式.之前没发现这个问题时来来回回改了好多次,都没有解决问题,直到发现根源!

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

原文链接:https://HdhCmsTestcnblogs测试数据/paisen/p/11423012.html

查看更多关于mybatisplus中EntityWrapper的常用方法的详细内容...

  阅读:108次