文章目录

场景说明

  简单来说,我们系统中许多数据都是树状结构的,所以我定义了一个实体类父类BaseTreePO,并且想封装一个通用的树状对象的Service类,部分代码如下:

  1. public interface TreeService<T extends BaseTreePO> extends IService<T> {
  2. default String getCurrentMaximumChildPath(T entity, String parentPath) {
  3. LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<T>()
  4. .orderByDesc(T::getPath);//在这里通过T::getPath获取字段名时报错
  5. if (StrUtil.isEmpty(parentPath)) {
  6. wrapper.isNull(T::getParentPath);
  7. } else {
  8. wrapper.eq(T::getParentPath, parentPath);
  9. }
  10. T maxPathChild = this.getBaseMapper().selectOne(this.doAppend(wrapper, entity));
  11. return ObjectUtil.isEmpty(maxPathChild) ? null : maxPathChild.getPath();
  12. }
  13. }


  如上述代码所示,在执行T::getPath时报错,报错堆栈信息如下:

  1. com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not find lambda cache for this entity [com.copm.ifm.base.basic.pojo.BaseTreePO]
  2. at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:49)
  3. at com.baomidou.mybatisplus.core.toolkit.Assert.isTrue(Assert.java:38)
  4. at com.baomidou.mybatisplus.core.toolkit.Assert.notNull(Assert.java:72)
  5. at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.tryInitCache(AbstractLambdaWrapper.java:94)
  6. at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.getColumn(AbstractLambdaWrapper.java:79)
  7. at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:62)
  8. at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:58)
  9. at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:38)
  10. at com.baomidou.mybatisplus.core.conditions.AbstractWrapper.lambda$orderBy$82c52469$1(AbstractWrapper.java:310)
  11. at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
  12. at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
  13. at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
  14. at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
  15. at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
  16. at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  17. at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
  18. at com.baomidou.mybatisplus.core.conditions.segments.OrderBySegmentList.transformList(OrderBySegmentList.java:37)
  19. at com.baomidou.mybatisplus.core.conditions.segments.AbstractISegmentList.addAll(AbstractISegmentList.java:60)
  20. at com.baomidou.mybatisplus.core.conditions.segments.MergeSegments.add(MergeSegments.java:50)
  21. at com.baomidou.mybatisplus.core.conditions.AbstractWrapper.doIt(AbstractWrapper.java:469)
  22. at com.baomidou.mybatisplus.core.conditions.AbstractWrapper.orderBy(AbstractWrapper.java:310)
  23. at com.baomidou.mybatisplus.core.conditions.AbstractWrapper.orderBy(AbstractWrapper.java:47)
  24. at com.baomidou.mybatisplus.core.conditions.interfaces.Func.orderByDesc(Func.java:264)
  25. at com.baomidou.mybatisplus.core.conditions.interfaces.Func.orderByDesc(Func.java:245)
  26. at com.copm.ifm.base.service.TreeService.getCurrentMaximumChildPath(TreeService.java:161)

解决方案

  给对应的父类也单独增加一个Mapper类即可:

  1. package com.copm.ifm.base.service.base.mapper;
  2. import com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder;
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.copm.ifm.base.basic.pojo.BaseTreePO;
  5. /**
  6. * 因为MP3.2+之后不会缓存实体类的父类字段信息,所以在使用泛型的Lambda表达式时会报错
  7. * {@code MybatisPlusException: can not find lambda cache for this entity [com.copm.ifm.base.basic.pojo.BaseTreePO]}
  8. * 原因是在执行{@link com.baomidou.mybatisplus.core.toolkit.LambdaUtils#getColumnMap(Class)}时
  9. * {@code COLUMN_CACHE_MAP}中没有{@link BaseTreePO}的信息
  10. *
  11. * <p>
  12. * 根据源码
  13. * {@link com.baomidou.mybatisplus.core.MybatisMapperRegistry#addMapper(Class)}
  14. * {@link MybatisMapperAnnotationBuilder#parse()}方法的加载逻辑
  15. * <p>
  16. * 他会将所有扫描到的mapper中的泛型({@link BaseMapper<Class>}中的Class,即实体类)的字段信息缓存到
  17. * {@link com.baomidou.mybatisplus.core.toolkit.LambdaUtils}中的{@code COLUMN_CACHE_MAP}中。
  18. * 但是MP3.2+之后不会加载父类的信息,所以{@code COLUMN_CACHE_MAP}中没有相关缓存,就报错了。
  19. * <p>
  20. * 因此我们单独为{@link BaseTreePO}添加一个的Mapper类,这样他就会缓存该类的信息了。
  21. */
  22. public interface BaseTreeMapper extends BaseMapper<BaseTreePO> {
  23. }

  具体原因也写在了代码的注释上,这样别人在看到这个类的时候也知道是怎么回事了。

  需要注意的是,我这里是没有加@Mapper注解的,因为我在启动类上加了@MapperScan注解。加了@MapperScan就不需要给每个Mapper类单独加@Mapper了,如果你没有加@MapperScan,则需要给他加上@Mapper

MybatisPlusException: can not find lambda cache for this entity[]异常解决的更多相关文章

  1. Java Lambda表达式forEach无法跳出循环的解决思路

    Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...

  2. [转帖]Linux中buff/cache内存占用过高解决办法

    Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...

  3. Linux中Cache内存占用过高解决办法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显 ...

  4. c++之—— lambda表达式(有个未能解决的问题等待大佬解答)——(在stack overflow找到了答案)

    谓词: 谓词是一个可调用的表达式,其返回结果是一个能用作条件的值.标准库算法所使用的谓词分为两类:一元谓词,意味着它只接受单一参数:二元谓词,意味着它有两个参数.接受谓词参数的算法对输入序列中的元素调 ...

  5. clone和lambda的一个小问题和解决

    起因是这样,某管理器类有两个集合,A集合是模板集合,B集合是从模板中实例出的集合. 但是B集合的一些东西,总会调用A集合中的,导致出错. 一开始考虑clone使用不当,但检查后没发现什么问题,后来发现 ...

  6. Spring Cache无效的问题以及解决办法

    http://blog.csdn.net/kimylrong/article/details/50126979 @Cacheable标注的方法,如果其所在的类实现了某一个接口,那么该方法也必须出现在接 ...

  7. Linux 中 Buffer/Cache内存占用过高解决方法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显 ...

  8. Linux中buff/cache内存占用过高解决办法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个centos7的系统上,free命令的显示内容大概是这样一个状态: 这个命令几乎是每一个使用过Linux的人必会的命令,但越是 ...

  9. Lambda表达式关于like问题(未解决)

    参考文章: http://stackoverflow.com/questions/3616215/like-in-lambda-expression-and-linq 1. c=>c.name. ...

  10. [UE4]The global shader cache file missing 运行错误解决办法

    UE4项目在VS中对项目代码编译时报如错,找了好久在UE4论坛上查到了别人的解决方案,贴出来仅供大家参考. 看到一位开发者解释出错的原因如下: There are a number of build ...

随机推荐

  1. 对抗生成网络(GAN)简单介绍

    对抗生成网络主要由生成网络和判别网络构成,GAN在图像领域使用较多.利用生成网络生成假的图像,然后利用判别器是否能判断该图像是假的. 1.用于医学图像分割,一般我们可以利用一个U-Net网络生成分割结 ...

  2. 2021年11月墨天轮国产数据库排行榜:openGauss闯入前三,Kingbase流行度与日俱增,TDengine厚积薄发

    2021年11月的国产数据库流行度排行榜已在墨天轮发布,本月共有163家数据库参与排名.就前15名的总体情况来看,除openGauss反超OceanBase闯入前三,TDengine厚积薄发来到第15 ...

  3. Docker高阶篇(一)

    本篇章主要为工作实践过程中对高端应用的处理和把控 1.Docker复杂安装 mysql的主从复制 https://www.bilibili.com/video/BV1gr4y1U7CY?p=41&am ...

  4. 在 OpenFunction 中运行 Serverless 应用

    除了构建和运行 Serverless 函数之外,OpenFuntion 还支持构建和运行 Serverless 应用.因此,OpenFunction 用户可以不用局限在各语言的 functions-f ...

  5. PHP实现csv导出(多种方法对比及原理解析)

    前言 导出文件时,如果不需要任何复杂的Excel功能,请使用CSV 工作中最初遇到导出Excel的需求,都是使用的PHPExcel,它的功能非常强大,可以覆盖到绝大多数的定制化导出需求.也就一直用着了 ...

  6. AI For Everyone_Week_1 By Andrew NG 课程英文

    AI For Everyone__Week__1 By Andrew NG 1 Introduction Welcome to AI for everyone. AI is changing the ...

  7. 无需等待Vue Release发布,就能在项目中体验最新版

    前言 两个月前尤大在Vue 仓库中引入了 pkg.pr.new,有了这个后Vue仓库中的每个commit或者PR都会自动触发一个新的发布,我们就可以在项目中体验最新版本的Vue啦. 关注公众号:[前端 ...

  8. git知识点,常用命令

    git理论知识 git的服务器端(remote)端包含多个repository,每个repository可以理解为一个项目. 而每个repository下有多个branch."origin& ...

  9. 枚举(C语言)

    1.枚举定义 枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读. 枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性. 定义一个枚 ...

  10. MindSponge分子动力学模拟——增强采样(2024.11)

    技术背景 关于增强采样(Enhanced Sampling)算法的具体原理,这里暂不做具体介绍,感兴趣的童鞋可以直接参考下这篇综述文章:Enhanced sampling in molecular d ...