MyBatis-Plus调用getEntity()触发异常

代码lambdaQuery().eq(Serve::getId, id).getEntity() 出现异常报错can not use this method for "getEntity"

问题定位与原因

在 MyBatis-Plus 中,lambdaQuery() 返回的是 LambdaQueryChainWrapper,虽然它理论上支持 getEntity(),但在 3.4.3.2 这个版本中存在兼容性问题:直接链式调用 getEntity() 会触发该异常 ,正确的做法是先通过 one() 获取实体对象,而不是 getEntity()

另外代码还有一个小问题:返回的 serve 是更新前的对象(状态还是草稿/下架),不符合接口语义(应该返回上架后的最新状态)。

修复后的完整代码

java 复制代码
public Serve onSale(Long id) {
    // 1. 服务为草稿或者下架状态才能上架(修复:用 one() 替代 getEntity() 获取实体)
    Serve serve = lambdaQuery().eq(Serve::getId, id).one();
    
    // 增加空值判断,避免空指针异常(补充健壮性)
    if (serve == null) {
        throw new NotFoundException("未找到ID为" + id + "的服务");
    }
    
    // 检查上架状态(假设 2=已上架,1=草稿/下架,需根据实际枚举值调整)
    if (serve.getSaleStatus() == 2) {
        throw new ForbiddenOperationException("该服务已经上架");
    }
    
    // 2. 上架服务
    boolean update = lambdaUpdate()
            .eq(Serve::getId, id)
            .set(Serve::getSaleStatus, 2) // 设置为上架状态
            .update();
    
    // 3. 判断是否修改成功
    if (!update) {
        throw new CommonException("修改失败");
    }
    
    // 4. 返回更新后的最新实体(优化:避免返回旧状态)
    return lambdaQuery().eq(Serve::getId, id).one();
}

关键修改点解释

  1. 核心修复lambdaQuery().eq(Serve::getId, id).getEntity()lambdaQuery().eq(Serve::getId, id).one()

    • one() 是 MyBatis-Plus 推荐的获取单条记录的方法,功能等价于 getEntity(),但兼容性更好,不会触发该异常。
    • getEntity() 更多是内部方法,不建议直接在业务代码中调用。
  2. 补充空值判断 :增加 if (serve == null) 逻辑,避免查询不到服务时调用 serve.getSaleStatus() 出现空指针异常,符合生产环境代码的健壮性要求。

  3. 优化返回值 :更新后重新查询并返回最新的实体,确保返回的 servesaleStatus 是已上架的状态(2),而不是更新前的旧值。

验证方式

  1. 调用该方法,传入未上架的服务ID:应成功将状态改为2,并返回最新状态的服务对象。
  2. 传入已上架的服务ID:应抛出 ForbiddenOperationException,提示"该服务已经上架"。
  3. 传入不存在的服务ID:应抛出 NotFoundException,提示未找到服务。
  4. 检查日志,确认不再出现 MybatisPlusException: can not use this method for "getEntity" 异常。

总结

  1. 核心问题 :在 3.4.3.2 版本的 MyBatis-Plus 中,LambdaQueryChainWrapper 直接调用 getEntity() 会触发异常,需替换为 one()
  2. 关键修复 :将 getEntity() 改为 one(),并补充空值判断、返回最新实体,提升代码健壮性。
  3. 最佳实践 :MyBatis-Plus 中获取单条实体优先使用 one(),更新操作后如需返回最新数据,应重新查询,避免返回更新前的旧对象。
相关推荐
腻害兔8 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨11 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说13 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199414 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了15 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品15 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘15 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记15 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端