mybatisplus之Wrappers.ne踩坑记录解决

作者:data_too_long 时间:2021-08-28 10:13:13 

一段看似平平无奇的代码

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()的执行

以为它不会执行后面的操作纯属自己&ldquo;一厢情愿、自作多情&rdquo;

在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

标签:mybatisplus,Wrappers.ne,踩坑
0
投稿

猜你喜欢

  • java swing实现QQ账号密码输入框

    2023-01-13 06:26:52
  • Java for循环标签跳转到指定位置的示例详解

    2022-10-04 17:52:31
  • 对Java的面对对象编程中对象和引用以及内部类的理解

    2022-02-22 12:11:15
  • Mybatis对mapper的加载流程深入讲解

    2022-06-01 12:33:04
  • 关于Java float和double精度范围大小

    2023-11-29 00:52:01
  • 使用java实现BBS论坛发送邮件过程详解

    2022-12-19 16:58:30
  • Android token过期刷新处理的方法示例

    2023-11-23 14:11:40
  • SpringBoot获取前台参数的六种方式以及统一响应

    2023-08-22 21:25:23
  • JAVA使用JDBC连接oracle数据库的详细过程

    2021-11-20 19:20:19
  • Java毕业设计实战之线上水果超市商城的实现

    2021-09-15 19:23:01
  • Java RateLimiter的限流详解

    2023-01-06 17:14:12
  • java解析json数组方式

    2023-08-10 17:22:14
  • java实现PPT转化为PDF

    2021-06-17 05:02:24
  • Java 高并发三:Java内存模型和线程安全详解

    2021-10-24 07:04:13
  • 详解MyBatis配置typeAliases的方法

    2023-11-29 06:21:52
  • 解析Java的Hibernate框架中的持久化类和映射文件

    2023-08-19 15:00:05
  • Java创建线程的七种方法总结(全网最全面)

    2023-11-03 14:27:26
  • C# 添加对System.Configuration.dll文件的引用操作

    2022-03-05 22:20:31
  • 解决logback-classic 使用testCompile的打包问题

    2021-07-01 08:16:50
  • java创建多级目录文件的实例讲解

    2023-11-27 09:29:02
  • asp之家 软件编程 m.aspxhome.com