当前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>