## Mybatis-Plus ### LambdaUpdateWapper 配合泛型使用报错:com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not find lambda cache for this property [xxx] of entity [com.xxx.si.fss.ssf.ass.entity.xxx] ```java public interface CloseV1Service { BaseMapper getBaseMapper(); default void action(CloseOperateVO operateVO){ if (NullUtils.isEmpty(operateVO.getId())){ throw new MyException(RestResponse.MSG.PARAM_VALUE_ERROR).setMsg("未发现指定操作对象id"); } T closeEntity = getBaseMapper().selectById(operateVO.getId()); if (closeEntity==null){ throw new MyException(RestResponse.MSG.NO_DATA_EXISTS); } closeEntity.closeable(operateVO.getCloseAction()); LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); lambdaUpdateWrapper .eq(T::getId,operateVO.getId()) //此处抛出异常 .set(T::getCloseStatus, operateVO.getCloseAction().getStepState()); getBaseMapper().update(null,lambdaUpdateWrapper); } } ``` #### 原因:LambdaUpdateWrapper没有指定实体类类型 #### 解决方法:为LambdaUpdateWrapper对象指定实体类类型 ```java @Validated public interface CloseV1Service { Class getTClass(); BaseMapper getBaseMapper(); default void action(@NotNull(message = "操作VO对象不能为空") @Valid CloseOperateVO operateVO){ if (NullUtils.isEmpty(operateVO.getId())){ throw new MyException(RestResponse.MSG.PARAM_VALUE_ERROR).setMsg("未发现指定操作对象id"); } T closeEntity = getBaseMapper().selectById(operateVO.getId()); if (closeEntity==null){ throw new MyException(RestResponse.MSG.NO_DATA_EXISTS); } closeEntity.closeable(operateVO.getCloseAction()); //Wrappers.lambdaUpdate(getTClass()); 创建LambdaUpdate时指定实体类 LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(getTClass()); //或者lambdaUpdateWrapper.setEntityClass(getTClass()); lambdaUpdateWrapper.eq(T::getId,operateVO.getId()).set(T::getCloseStatus, operateVO.getCloseAction().getStepState()); getBaseMapper().update(null,lambdaUpdateWrapper); } } ``` ### LambdaUpdateWapper 配合泛型使用出现错误:java.lang.BootstrapMethodError: call site initialization exception ```java public interface CloseV1Service { Class getTClass(); BaseMapper getBaseMapper(); default void action(@NotNull(message = "操作VO对象不能为空") @Valid CloseOperateVO operateVO){ if (NullUtils.isEmpty(operateVO.getId())){ throw new MyException(RestResponse.MSG.PARAM_VALUE_ERROR).setMsg("未发现指定操作对象id"); } T closeEntity = getBaseMapper().selectById(operateVO.getId()); if (closeEntity==null){ throw new MyException(RestResponse.MSG.NO_DATA_EXISTS); } closeEntity.closeable(operateVO.getCloseAction()); LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(getTClass()); lambdaUpdateWrapper .eq(T::getId,operateVO.getId()) //此处抛出异常 因为CloseStatefulEntity存在getId()方法 而CloseV1able不存在 .set(T::getCloseStatus, operateVO.getCloseAction().getStepState()); getBaseMapper().update(null,lambdaUpdateWrapper); } } ``` #### 原因:LambdaUpdateWrapper设置的泛型是因为有两个上界,LambdaUpdateWrapper使用方法引用时泛型的方法,这个方法只在泛型一个上界类中存在则抛出java.lang.BootstrapMethodError: call site initialization exception异常 #### 解决办法:在两个上界中都添加用到的方法或者只设置一个上界