mybatisplus之Wrappers.ne踩坑记录解决
作者:data_too_long 发布时间:2021-08-28 10:13:13
标签:mybatisplus,Wrappers.ne,踩坑
一段看似平平无奇的代码
Classroom classroom = this.getOne(
Wrappers.<Classroom>lambdaQuery()
.select(Classroom::getId, Classroom::getJoinType)
.eq(Classroom::getClassId, signupSubmitVO.getClassId())
.eq(Classroom::getUserId, userId)
);
if (joinType == null && classroom != null) {
joinType = classroom.getJoinType();
}
List<Classroom> hasClassroomList = this.list(
Wrappers.<Classroom>lambdaQuery()
.select(Classroom::getId, Classroom::getProvinceId, Classroom::getCityId, Classroom::getAreaId)
.eq(Classroom::getClassId, signupSubmitVO.getClassId())
.ne(classroom != null, Classroom::getId, classroom.getId()) //空指针
);
在测试过程中发生了预期之外的异常,在 .ne(signup != null, YySignup::getId, signup.getId())
处报了空指针 在编写这个逻辑的时候,就预料到了classroom
可能为null,所以才用了ne(boolean condition, R column, Object val)
这个方法
按照我理解的逻辑当condition
为false也就是classroom
为null时,后面的条件就不会触发,自然classroom.getId()
就不会执行,那自然就不会出现空指针异常。
报了异常
但实际它还是报了异常,再认真看了文档,关于condition
的说明
boolean condition:表示该条件是否加入最后生成的sql中
也就是说condition
只影响.ne( Classroom::getId, classroom.getId())
这个条件是否加入最后生成的sql,并不会影响classroom.getId()
的执行
以为它不会执行后面的操作纯属自己“一厢情愿、自作多情”
在mybatis关于ne
的源码中第二个参数是一个Object
类型的参数
default Children ne(R column, Object val) {
return this.ne(true, column, val);
}
而上述代码中传入的是classroom.getId()
,方法在执行过程中需要将这个表达式转换成具体的值,也就是执行classroom.getId()
,而此时classroom为null,自然就报空指针了。
将classroom是否为null单独拿出来判断
为了规避这个问题,应该需要将classroom是否为null单独拿出来判断
Classroom classroom = this.getOne(
Wrappers.<Classroom>lambdaQuery()
.select(Classroom::getId, Classroom::getJoinType)
.eq(Classroom::getClassId, signupSubmitVO.getClassId())
.eq(Classroom::getUserId, userId)
);
if (joinType == null && classroom != null) {
joinType = classroom.getJoinType();
}
LambdaQueryWrapper<Classroom> query = Wrappers.<Classroom>lambdaQuery()
.select(Classroom::getId, Classroom::getProvinceId, Classroom::getCityId, Classroom::getAreaId)
.eq(Classroom::getClassId, signupSubmitVO.getClassId())
if (classroom != null) {
query.ne(Classroom::getId, classroom.getId());
}
虽然麻烦了一点点,但规避了问题。
来源:https://juejin.cn/post/7230595863692509243


猜你喜欢
- 当 Maven 无法依赖 spring-cloud-starter-zipkin 时,您可以尝试以下方法解决:确保拼写正确:请检查项目中的
- 突然心血来潮,想自己做个小程序玩玩,但是怎么把他做成一个exe文件,让大家能够更好的理解和使用呢,百度了一下,说是需要exe4j来生成,但是
- 前面几篇案例已经将常用的交换器(DirectExchange、TopicExchange、FanoutExchange)的用法介绍完了,现在
- 最近看Android FrameWork层代码,看到了ThreadLocal这个类,有点儿陌生,就翻了各种相关博客一一拜读;自己随后又研究了
- 本文实例讲述了C#判断系统是32位还是64位的方法。分享给大家供大家参考。具体如下:public static int GetOSBit()
- foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,colle
- 详解JDK中ExecutorService与Callable和Future对线程的支持1、代码背景: 假
- Unity没有像Vs那样的“*.sln”的项目工程文件,不能通过这个文件来打开工程。但是原有的打开已有工程的方法太过于麻烦了,则现在来通过添
- 饿汉式立即加载防止new对象,构造私有,写一个公共的方法返回对象占用空间,线程安全public class Singleton { &nbs
- 本文实例为大家分享了ImageSwitcher图像切换器的实现代码,供大家参考,具体内容如下描述在该实例中,提供一个图片切换器和两个点击按钮
- 上一篇中我们介绍了自定义实现BaseAdapter的普通实现布局,然而上一章也说了普通实现的方式效率会很低,而且对系统开销也很大,所以,那样
- 1.3扫描线种子填充算法1.1和1.2节介绍的两种种子填充算法的优点是非常简单,缺点是使用了递归算法,这不但需要大量栈空间来存储相邻的点,而
- 引言上文Android:实现一个自定义有限制区域的图例(角度自识别)涂鸦工具类(中)中我们已经实现了在复杂的异形区域中涂鸦,最后生成图片保存
- 我们有一个TextView,其里面的内容是可以通过代码动态改变的,我们想用一张图片作为TextView的背景,实现类似于手机QQ对话中的气泡
- 自定义View一直是横在Android开发者面前的一道坎。一、View和ViewGroup的关系从View和ViewGroup的关系来看,V
- /// <summary> /// 为图片生成缩略图 /// </summ
- 1.JWT定义JWT(Json Web Token)是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的
- jedis是redis的java客户端,spring将redis连接池作为一个bean配置。redis连接池分为两种,一种是“redis.c
- 本文实例为大家分享了Android仿京东分类效果展示的具体代码,供大家参考,具体内容如下1.写一个fragmentimport androi
- file: BluetoothEventLoop.java GB/GB2/GB3: 1. import android.os.PowerMa