代码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();
}
关键修改点解释
-
核心修复 :
lambdaQuery().eq(Serve::getId, id).getEntity()→lambdaQuery().eq(Serve::getId, id).one()one()是 MyBatis-Plus 推荐的获取单条记录的方法,功能等价于getEntity(),但兼容性更好,不会触发该异常。getEntity()更多是内部方法,不建议直接在业务代码中调用。
-
补充空值判断 :增加
if (serve == null)逻辑,避免查询不到服务时调用serve.getSaleStatus()出现空指针异常,符合生产环境代码的健壮性要求。 -
优化返回值 :更新后重新查询并返回最新的实体,确保返回的
serve中saleStatus是已上架的状态(2),而不是更新前的旧值。
验证方式
- 调用该方法,传入未上架的服务ID:应成功将状态改为2,并返回最新状态的服务对象。
- 传入已上架的服务ID:应抛出
ForbiddenOperationException,提示"该服务已经上架"。 - 传入不存在的服务ID:应抛出
NotFoundException,提示未找到服务。 - 检查日志,确认不再出现
MybatisPlusException: can not use this method for "getEntity"异常。
总结
- 核心问题 :在 3.4.3.2 版本的 MyBatis-Plus 中,
LambdaQueryChainWrapper直接调用getEntity()会触发异常,需替换为one()。 - 关键修复 :将
getEntity()改为one(),并补充空值判断、返回最新实体,提升代码健壮性。 - 最佳实践 :MyBatis-Plus 中获取单条实体优先使用
one(),更新操作后如需返回最新数据,应重新查询,避免返回更新前的旧对象。