03_Mybatis-Plus LambadaQueryWrapper 表达式爆空指针异常

🌟 03_MyBatis-Plus LambdaQueryWrapper 爆出空指针异常的坑点分析

❓ 场景描述

来看一段常见的 MyBatis-Plus 查询写法,是否存在问题?

Page<VideoInfoVo> videoInfoVosPage = videoMapper.selectPage(page, new LambdaQueryWrapper<VideoInfoVo>().eq(videoAdtReq.getUserId() != null, VideoInfoVo::getUserId, videoAdtReq.getUserId()).ge(videoAdtReq.getStartTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getStartTime().atStartOfDay()).le(videoAdtReq.getEndTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getEndTime().atTime(LocalTime.MAX))
);

💥 问题分析:会爆出 NullPointerException!

🔍 错误点在哪?

.ge(videoAdtReq.getStartTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getStartTime().atStartOfDay())
.le(videoAdtReq.getEndTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getEndTime().atTime(LocalTime.MAX))

表面上看已经做了非空判断,似乎没有问题,但实际上,这样写仍然可能爆出 NullPointerException


🚨 关键误区:Java 的参数求值顺序

Java 会在调用方法前,先对所有参数进行求值,然后再把这些值传给方法体。

所以即使你写了:

videoAdtReq.getStartTime() != null

Java 仍然会执行

videoAdtReq.getStartTime().atStartOfDay()

如果 getStartTime() 返回的是 null,那 .atStartOfDay() 立即爆 NPE


✅ 正确写法:提前提取变量,避免链式空指针

LocalDateTime start = null;
LocalDateTime end = null;if (videoAdtReq.getStartTime() != null) {start = videoAdtReq.getStartTime().atStartOfDay();
}
if (videoAdtReq.getEndTime() != null) {end = videoAdtReq.getEndTime().atTime(LocalTime.MAX);
}Page<VideoInfoVo> videoInfoVosPage = videoMapper.selectPage(page, new LambdaQueryWrapper<VideoInfoVo>().eq(videoAdtReq.getUserId() != null, VideoInfoVo::getUserId, videoAdtReq.getUserId()).ge(start != null, VideoInfoVo::getUpdateTime, start).le(end != null, VideoInfoVo::getUpdateTime, end)
);

🧠 小结 Tips

写法是否安全原因
.eq(cond, field, value)✅ 安全不涉及链式 null 调用
.ge(cond, field, value.atStartOfDay())❌ 危险即使 cond == falsevalue.atStartOfDay() 已执行

📌 建议

  • 所有可能为 null 的链式操作都要提前拆解;
  • 不要在 .ge().le().like() 等条件方法内部写链式 null 调用
  • 最好在写查询条件前,先准备好转换后的数据变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB安全--社会工程--SET钓鱼网站

1、选择要钓鱼的网站 2、打开kali中的set 3、启动后依次选择&#xff1a; 4、输入钓鱼主机的地址&#xff08;kali&#xff09;和要伪装的网站域名&#xff1a; 5、投放钓鱼网页&#xff08;服务器域名:80&#xff09; 6、获取账号密码

Ethan独立开发产品日报 | 2025-04-29

1. mrge 代码审查的光标 mrge 是一个由人工智能驱动的代码审查平台&#xff0c;能够自动审核拉取请求&#xff08;PR&#xff09;&#xff0c;为人工审查员提供超级能力。它是像 cal.com 和 n8n 这样快速发展的团队的首选工具。 关键词&#xff1a;mrge, 代码审查, AI驱动, …

ubuntu22.04 qemu arm64 环境搭建

目录 创建 安装 Qemu 启动 # 进入qemu虚拟机后执行 qemu编译器安装 创建 qemu-img create ubuntu22.04_arm64.img 40G 安装 qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -drive ifnone,fileubuntu-22.04.5-live-server-a…

安全生产知识竞赛宣传口号160句

1. 安全生产是责任&#xff0c;每个人都有责任 2. 安全生产是保障&#xff0c;让我们远离危险 3. 安全生产是团结&#xff0c;共同守护每一天 4. 注重安全&#xff0c;守护明天 5. 安全生产无小事&#xff0c;关乎千家万户 6. 安全第一&#xff0c;人人有责 7. 安全生产无差别&…

Python 虚拟环境管理:venv 与 conda 的选择与配置

文章目录 前言一、虚拟环境的核心价值1.1 依赖冲突的典型场景1.2 隔离机制实现原理 二、venv 与 conda 的架构对比2.1 工具定位差异2.2 性能基准测试&#xff08;以创建环境 安装 numpy 为例&#xff09; 三、venv 的配置与最佳实践3.1 基础工作流3.2 多版本 Python 管理 四、…

【自然语言处理与大模型】如何获取特定领域的微调数据集?

在特定领域中&#xff0c;数据集通常由提出需求的一方提供。然而&#xff0c;在某些情况下&#xff0c;如果他们未能提供所需的数据&#xff0c;或者你正在独立开展一个项目&#xff0c;并且需要相应的数据来推进工作&#xff0c;这时你应该怎么办呢&#xff1f;本文提供一种思…

Map系列之ConcurrentHashMap源码分析:高并发场景下的性能密码

引言&#xff1a;当线程安全成为刚需 1.1 并发时代的Map困境 经典案例&#xff1a;电商秒杀系统超卖事故分析&#xff08;附线程堆栈截图&#xff09;传统方案缺陷&#xff1a;synchronizedMap的吞吐量陷阱&#xff08;JMH测试数据对比&#xff09;ConcurrentHashMap的定位&a…

URP - 序列图动画的实现

效果&#xff1a; 【太妃糖耶】更新了一条视频&#xff0c;快来围观&#xff01; 序列图动画的实现 首先先了解下序列图样式的纹理图片 如上图一可在Shader中使用该图片制作燃烧的火的动画&#xff0c;但是如何实现呢&#xff1f;接下来一起来看一下吧 序列图动画的实现原理大…

python中 str.strip() 是什么意思

在 Python 中&#xff0c;str.strip() 是字符串&#xff08;str&#xff09;类型的一个方法&#xff0c;用于移除字符串两端的空白字符&#xff08;默认情况下&#xff09;或指定字符&#xff0c;并返回处理后的新字符串。 语法&#xff1a; str.strip([chars])chars&#xf…

记录idea可以运行但是maven install打包却找不到问题

解决idea使⽤maven多模块install报依赖模块的包找不到的问题 如果被依赖项⽬是springboot项⽬&#xff0c;那么可以把相关的springboot的东西移除掉&#xff0c;改造成普通项⽬。如果不想改造项⽬&#xff0c;那就添加部分的配置&#xff0c;因为springboot项⽬打包的时候会⽣…

uniapp如何获取安卓原生的Intent对象

通过第三方app唤起&#xff0c;并且获取第三方app唤起时携带的参数 因为应用a唤起应用b时&#xff0c;应用b第一时间就要拿到参数token&#xff0c;所以需要将获取参数的方法写在APP.vue中的onLaunch钩子里,如果其他地方要用可以选择vuex或者采用本地缓存。 uniapp中plus.run…

《多端统一的终极答案:X5内核增强版的渲染优化全解析》

跨端应用的需求呈爆发式增长&#xff0c;无论是电商购物、社交互动&#xff0c;还是金融理财类应用&#xff0c;都期望能够在不同平台上为用户提供一致且流畅的体验。而在这一过程中&#xff0c;跨端渲染技术成为了关键瓶颈。腾讯X5内核增强版的出现&#xff0c;犹如一道曙光&a…

深入理解算力:从普通电脑到宏观计算世界

在科技飞速发展的当下&#xff0c;“算力” 一词频繁出现在我们的视野中&#xff0c;无论是前沿的人工智能领域&#xff0c;还是新兴的区块链世界&#xff0c;算力都扮演着至关重要的角色。但对于大多数普通人来说&#xff0c;算力仿佛是一个既熟悉又陌生的概念。今天&#xff…

Paramiko复用 Transport 连接解析

1. 什么是 Transport 连接&#xff1f; 在 Paramiko 中&#xff0c;Transport 是负责底层 SSH 协议通信的核心类&#xff0c;它封装了以下功能&#xff1a; 加密通信&#xff1a;处理 SSH 协议的加密和解密。会话管理&#xff1a;维护与远程服务器的 TCP 连接。多路复用&…

sd webui 安装插件sd-webui-EasyPhoto依赖安装失败解决办法

在最新版的SD webui中&#xff0c;可以安装easyphoto插件&#xff0c;官方建议通过github安装&#xff0c;对无法科学上网的用户很不友好。对我自己来说是通过地址&#xff1a; https://gitee.com/wowai/sd-webui-EasyPhoto.git 分支&#xff1a;anyid 点击安装即可。 在安装…

WEBSTORM前端 —— 第2章:CSS —— 第3节:背景属性与显示模式

目录 1.Emmet写法 2.背景属性 &#xff08;1&#xff09; background-color &#xff08;2&#xff09; background-image &#xff08;3&#xff09; background-repeat &#xff08;4&#xff09;background-position &#xff08;5&#xff09;background-size &…

【android bluetooth 协议分析 01】【HCI 层介绍 2】【Malformed Packet 介绍】

在实际工作中遇到了 malformed packet , 我这里来分析一下。 遇到这种问题的处理思路。 1. Malformed packet 36982 2025-04-29 14:15:34.899760 controller host HCI_EVT 4 Rcvd Role Change[Malformed Packet]Frame 36982: 4 bytes on wire (32 bits), 4 bytes captured (32…

【视频生成模型】通义万相Wan2.1模型本地部署和LoRA微调

目录 1 简介2 本地部署2.1 配置环境2.2 下载模型 3 文生视频3.1 运行命令3.2 生成结果 4 图生视频4.1 运行命令4.2 生成结果 5 首尾帧生成视频5.1 运行命令5.2 生成结果 6 提示词扩展7 LoRA微调 1 简介 通义万相 2.1 在 2025 年 1 月推出&#xff0c;2 月 25 日阿里巴巴宣布全…

模式识别的基本概念与理论体系

前面在讨论专家系统时曾经说过&#xff0c;为了使计算机具有自动获取知识的能力&#xff0c;除了应使它具有学习能力外&#xff0c;还应使它具有能识别诸如文字、图形、图象、声音等的能力&#xff0c;计算机的这种识别能力是模式识别研究的主要内容。当然&#xff0c;模式识别…

树的序列化 - 学习笔记

树的序列化可以有很多种类&#xff1a;可以变成 dfs 序&#xff0c;可以变成欧拉序&#xff0c;还有什么括号序的科技。 但是除了第一个以外其他的都没什么用&#xff08;要么也可以被已有的算法给替代掉&#xff09;。所以表面上是讲树的序列化&#xff0c;实际上还是讲的 df…