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","解决");

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

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

(0)

相关推荐

  • MyBatis-Plus工具使用之EntityWrapper解析

    目录 EntityWrapper使用解析 EntityWrapper源码解读 EntityWrapper使用解析 1.项目中引入jar包,我这里使用Maven构建 <dependency>     <groupId>com.baomidou</groupId>     <artifactId>mybatis-plus</artifactId>     <version>仓库最高版本号</version> </depe

  • 浅析Mybatis Plus和Mybatis的区别

    区别一 如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂. 通俗来讲-- MyBatis:一种操作数据库的框架,提供一种Mapper类,支持让你用java代码进行增删改查的数据库操作,省去了每次都要手写sql语句的麻烦.但是!有一个前提,你得先在xml中写好sql语句,是不是很麻烦?于是有下面的↓ Mybatis Generator:自动为Mybatis生成简单的增删改查sql语句的工具,省去一大票时间,两者配合使用,开发速度快到飞起.至于标题说的↓ M

  • Java中MyBatis Plus知识点总结

    好程序员Java教程分享MyBatis Plus介绍: 1.MyBatis Plus 介绍 MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. MyBatis Plus 的核心功能有:支持通用的 CRUD.代码生成器与条件构造器. 通用 CRUD:定义好 Mapper 接口后,只需要继承 BaseMapper<T> 接口即可获得通用的增删改查功能,无需编写任何接口方法与配置文件 条件构造器:通过 Ent

  • mybatisplus中EntityWrapper的常用方法

    目录 EntityWrapper的常用方法 粗心遇到的EntityWrapper的一个坑 原因 解决方案 EntityWrapper的常用方法 #WHERE (issue_type = ?) AND (status = ? OR status = ? OR status = ?) EntityWrapper wrapper=new EntityWrapper(); wrapper.eq("issue_type","缺陷").andNew().eq("sta

  • MybatisPlus中@TableField注解的使用详解

    实现 官方文档说明: com.baomidou.mybatisplus.annotations.TableField TableField注解新增属性 update 预处理 set 字段自定义注入 (讲解:比如我们使用mybatisplus自带的insert()方法向数据库插入数据时,假设我们给age字段赋值为1,但是我们在age字段上的@TableField注解里面加了update="%s+1",那么真真插入到数据库的值就是age=2,而不是age+1了) 例如: @TableFie

  • MyBatis-Plus中使用EntityWrappe进行列表数据倒序设置方式

    目录 使用EntityWrappe进行列表数据倒序设置 情景 如下进行倒序案例 条件构造器EntityWrapper用法 EntityWrapper 简介 使用EntityWrappe进行列表数据倒序设置 情景 项目中使用MyBatis-Plus的EntityWrapper,默认是升序,但实际项目中需要倒序显示,就查看了一下相关资料,在这里记录一下.  EntityWrapper是个很强大的玩意,支持多条件查询  EntityWrapper<CompanyInfoEntity>() wrapp

  • jQuery取得iframe中元素的常用方法详解

    本文实例分析了jQuery取得iframe中元素的常用方法.分享给大家供大家参考,具体如下: jquery取得iframe中元素的几种方法: 在iframe子页面获取父页面元素 代码如下: 复制代码 代码如下: $('#objId', parent.document); 搞定... 在父页面 获取iframe子页面的元素: $("#objid",document.frames('iframename').document) $(document.getElementById('ifra

  • 总结PHP中DateTime的常用方法

    前言 实例化对象前面加\表示的是,在命名空间中使用原生的类,如果没有使用命名空间的话,可以把前面的\给删除掉 1. 输出当前时间 $datetime = new \DateTime; print_r($datetime->format('Y-m-d H:i:s')); 2. 输出给定的时间 $datetime = new \DateTime('2016-06-13'); print_r($datetime); 3. 根据给定的时间格式化为自己想要的时间 $datetime = \DateTime

  • js中数组的常用方法小结

    本文实例总结了js中数组的常用方法.分享给大家供大家参考,具体如下: push 方法 该方法会把一个元素或一组元素(数组)添加到当前数组的末尾. eg: var arr1 = [1, 2, 3]; arr1.push([4, 5]); arr1的结果是[1, 2, 3, 4, 5] concat 方法 该方法会把两个数组或元素组合在一起,但是不会改变调用者的结构 eg: var arr1 = [1, 2, 3]; var arr2 = [4, 5]; var arr3 = arr1.concat

  • Javascript中的数组常用方法解析

    前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.周五啦,博主的心又开始澎湃了,明儿个周末有木有,又可以愉快的玩耍了. 创建数组 创建数组的基本方式有两种,一种字面量,另一种使用构造函数创建: var arr = [1,2,3]; //字面量的形式创建数组 值与值之间用英文逗号隔开 var arr = [1,2,3]; //字面量的形式创建数组 值与值之间用英文逗号隔开 var ar

  • C#中String类常用方法汇总

    本文实例汇总了C#中String类常用方法.分享给大家供大家参考.具体分析如下: C#中的String类很有用,下面是一些它的常用方法的总结,如果灵活运用这些的话,String类就掌握的差不多了. .ToLower()    //转为小写字符串"AbC"-->"abc" .ToUpper()    //转为大写"AbC" -->"ABC" .Trim()       //去掉字符串首尾的空格"  abc

  • Java中Math类常用方法代码详解

    近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void main(String args[]){ /** *Math.sqrt()//计算平方根 *Math.cbrt()//计算立方根 *Math.pow(a, b)//计算a的b次方 *Math.max( , );//计算最大值 *Math.min( , );//计算最小值 */ System.out.pri

  • Java中request对象常用方法汇总

    本文主要介绍了Java中的request对象,并且对request对象中的一些常用方法作了一点总结,如果你是Java初学者,或许这篇文章对你会有所帮助. HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. request常用方法: 一.获取客户机环境信息常见方法: 1.getRequestURL方法返回客户端发出请求时的完整URL. 2.getReques

随机推荐