当前位置: 首页 > ai >正文

Cause: org.apache.ibatis.ognl.OgnlException: sqlSegment

17:12:47.358 [http-nio-11080-exec-2] ERROR c.c.f.w.e.GlobalExceptionHandler - [handleRuntimeException,100] - 请求地址'/xx/xxx/xxx/xxx/xxx/8bbe5b132a7a4d9bb28cedfeac94d69f',发生未知异常.
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '''. Cause: org.apache.ibatis.ognl.OgnlException: sqlSegment [com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not use this method for "getSqlSegment"]at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:97)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)at com.sun.proxy.$Proxy129.delete(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.delete(SqlSessionTemplate.java:304)at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:69)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)at com.sun.proxy.$Proxy205.delete(Unknown Source)at com.baomidou.mybatisplus.extension.service.IService.remove(IService.java:146)at com.cn.basedata.service.impl.xxxxImpl.deletexxxIds(xxxxImpl.java:80)at com.cn.basedata.service.impl.xxxxImpl$$FastClassBySpringCGLIB$$35e8855a.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)at com.cn.basedata.service.impl.xxxxImpl$$EnhancerBySpringCGLIB$$94053a1.deletexxxByIds(<generated>)at com.cn.basedata.service.impl.xxxxImpl.deletexxxByIds(xxxxImpl.java:172)at com.cn.basedata.service.impl.xxxxImpl$$FastClassBySpringCGLIB$$17e90df0.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)at com.cn.basedata.service.impl.xxxxImpl$$EnhancerBySpringCGLIB$$cf8fb23.deletexxxByIds(<generated>)at com.cn.web.controller.xxx.xxx.remove(xxx.java:221)at com.cn.web.controller.videom

其中,报错的代码如下 (xxxImpl.deletexxxIds() 方法):

@Transactional(rollbackFor = Exception.class)public boolean deletexxxIds(List<String> ids) {return ids != null && ! ids.isEmpty() ? this.remove(this.lambdaQuery().in(xxx::getId, ids)) : false;}

问题在于:

  1. lambdaQuery() 创建的是一个 LambdaQueryWrapper,而 remove() 方法内部会尝试获取 sqlSegment

  2. 在某些 MyBatis-Plus 版本中,这种链式调用会导致 getSqlSegment 方法被错误调用

解决方案

方案1:改用传统 QueryWrapper(推荐)
@Override
@Transactional(rollbackFor = Exception.class)
public boolean deletexxxIds(List<String> ids) {if (ids == null || ids.isEmpty()) {return false;}QueryWrapper<xxx> wrapper = new QueryWrapper<>();wrapper.in("id", ids);return this.remove(wrapper);
}
 方案2:分离 Lambda 表达式构造
@Override
@Transactional(rollbackFor = Exception.class)
public boolean deletexxxIds(List<String> ids) {if (ids == null || ids.isEmpty()) {return false;}LambdaQueryWrapper<xxx> wrapper = Wrappers.lambdaQuery();wrapper.in(xxx::getId, ids);return this.remove(wrapper);
}
方案4:升级 MyBatis-Plus 版本

如果是版本问题(特别是 3.4.x 之前的版本),建议升级到最新稳定版:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>

为什么这样修改有效?

原始代码中的链式调用 this.remove(this.lambdaQuery().in(...)) 在某些版本中会导致:

  1. 条件构造器被过早评估

  2. 内部尝试获取 sqlSegment 时上下文不完整

而分离构造步骤(方案2)或使用传统 QueryWrapper(方案1)可以避免这种内部处理冲突。这是 MyBatis-Plus 实现细节导致的问题,官方文档中也推荐避免过于复杂的链式调用。

http://www.xdnf.cn/news/7955.html

相关文章:

  • 【C++】位图+布隆过滤器
  • JAVA EE(进阶)_CSS
  • 如何排查服务器 CPU 温度过高的问题并解决?
  • C++ 前缀和数组
  • C++STL(二)类模板
  • YCKC【二分查找专题】题解
  • 《对话记忆的进化史:智能体大模型如何实现跨轮次的深度交互》
  • 国酒华夏实业酒水供应链:全品类覆盖打造一站式购销平台
  • 第四十三节:人脸检测与识别-人脸识别基础 (Eigenfaces, Fisherfaces, LBPH)
  • Selenium自动化测试终极指南:从原理到实战
  • 【Python生成器全解析】从基础到高阶应用实战
  • C语言—Linux环境下CMake设置库(动态/静态)
  • 借助IEDA ,Git版本管理工具快速入门
  • 多线程(七)
  • 开疆智能Profinet转RS485网关连接工业型土壤水分温度传感器 配置案例
  • 如何在 Windows 10 或 11 上安装 Adminer?
  • 非欧空间计算加速:图神经网络与微分几何计算的GPU优化(流形数据的内存布局优化策略)
  • MEMO数据DID与ZK技术:赋能RWA代币化与可信流通的新基石
  • BI 大屏是什么意思?具体应用在哪些方面?
  • 全球气体压力调节器市场深度洞察:技术演进、区域竞争与可持续发展路径(2025-2031)
  • 洛谷P1226 【模板】快速幂
  • VRRP 协议
  • SQL优化学习笔记
  • 微店平台店铺商品接口开发指南
  • 【JavaScript异步编程终极指南】从回调地狱到Async/Await的实战突围
  • 动态库和静态库
  • NHANES最新指标推荐:α-Klotho
  • BUUCTF——Web1
  • 第十节第四部分:常见API:秒杀案例、Calendar
  • 学习黑客了解5分钟了解中间人攻击(MITM)