springboot 集成mybatis-plus异常 MybatisPlusException: can not find lambda cache for this property [*]

当前mybatis-plus 版本为3.3.2

  <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter
        移除了mysql性能分析插件-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>

1.执行方法代码,多表关联分页查询

 @RequestMapping(value ="/selectPageByPressLambdaWrapper" , method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
    public IPage<PressInfoEntity> selectPageByPressLambdaWrapper(){
        LambdaQueryWrapper<PressInfoEntity> queryWrapper = new QueryWrapper<PressInfoEntity>().lambda();
        queryWrapper.like(PressInfoEntity::getShortPress,"版");
        //使用非当前表内字段做查询
        //异常  can not find lambda cache for this property [name] of entity[com.test.mybatisplus.entity.PressInfoEntity]
        queryWrapper.like(PressInfoEntity::getName,"测试");

        Page<PressInfoEntity> page=new Page<>(1,5);
        IPage<PressInfoEntity> iPage=   pressInfoService.selectPageByPressLambdaWrapper(page,queryWrapper);
        return  iPage;
    }

中name不在t_press_info的表中,使用 

@TableField(exist = false)
        private String name;

2. Entity

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value="t_press_info")
public class PressInfoEntity {
        @TableId
        private int id;

        @TableField(value = "short_press")
        private String shortPress;

        @TableField(value = "press")
        private String press;

        @TableField(value = "create_time")
        private Date createTime;

        @TableField(value = "update_time")
        private Date updateTime;

        /**非当前表字段*/
        /*@Builder  若有非当前表字段,得注意类构造函数
        @NoArgsConstructor
        @AllArgsConstructor*/
        @TableField(exist = false)
        private String name;
}

3、异常

com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not find lambda cache for this property [name] of entity [com.test.mybatisplus.entity.PressInfoEntity]
	at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:49) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at com.baomidou.mybatisplus.core.toolkit.Assert.isTrue(Assert.java:38) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at com.baomidou.mybatisplus.core.toolkit.Assert.notNull(Assert.java:72) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.getColumn(AbstractLambdaWrapper.java:87) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:63) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:59) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:39) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at com.baomidou.mybatisplus.core.conditions.AbstractWrapper.lambda$likeValue$17384082$1(AbstractWrapper.java:344) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_211]
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) ~[na:1.8.0_211]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_211]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_211]
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_211]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_211]

 

4、原因

根据异常debug定位到

 

根据获取到的columnMap,定位何处初始化的这个map,

在LambdaUtils.java初始化map数据逇时候只会把存在表中的字段丢进去。

   private static Map<String, ColumnCache> createColumnCacheMap(TableInfo info) {
        Map<String, ColumnCache> map = new HashMap();
        String kp = info.getKeyProperty();
        if (StringUtils.isNotBlank(kp)) {
            map.put(formatKey(kp), new ColumnCache(info.getKeyColumn(), info.getKeySqlSelect()));
        }

        info.getFieldList().forEach((i) -> {
            ColumnCache var10000 = (ColumnCache)map.put(formatKey(i.getProperty()), new ColumnCache(i.getColumn(), i.getSqlSelect()));
        });
        return map;
    }

5、解决方案 

1. 不使用LambdaQueryWrapper

 使用QueryWrapper


 QueryWrapper<PressInfoEntity> queryWrapper = new QueryWrapper<PressInfoEntity>();
 queryWrapper.like("t.short_press","版");
 queryWrapper.like("t1.name","测试");
 IPage<PressInfoEntity> iPage=   pressInfoService.selectPageByPressWrapper(page,queryWrapper);


推荐常规写法

 PressInfoEntity pressInfoEntity = PressInfoEntity.builder().press(press).build();       
 Page<PressInfoEntity> page=new Page<>(1,5);
 IPage<PressInfoEntity> iPage=   pressInfoService.selectPageByEntity(page,pressInfoEntity); 
 #sql和mybatis一样就好
  select t.*,t1.name from t_press_info t
        left join t_press t1 on t.id=t1.press_info_id
        <where> t.short_press like CONCAT('%',#{et.shortPress},'%')  </where>

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值