MybatisPlusException: can not find lambda cache for this entity[]異常解決


文章目錄

 

場景說明

  簡單來說,我們系統中許多數據都是樹狀結構的,所以我定義了一個實體類父類BaseTreePO,並且想封裝一個通用的樹狀對象的Service類,部分代碼如下:

public interface TreeService<T extends BaseTreePO> extends IService<T> { default String getCurrentMaximumChildPath(T entity, String parentPath) { LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<T>() .orderByDesc(T::getPath);//在這里通過T::getPath獲取字段名時報錯 if (StrUtil.isEmpty(parentPath)) { wrapper.isNull(T::getParentPath); } else { wrapper.eq(T::getParentPath, parentPath); } T maxPathChild = this.getBaseMapper().selectOne(this.doAppend(wrapper, entity)); return ObjectUtil.isEmpty(maxPathChild) ? null : maxPathChild.getPath(); } } 

 

 


  如上述代碼所示,在執行T::getPath時報錯,報錯堆棧信息如下:

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

 

 

解決方案

  給對應的父類也單獨增加一個Mapper類即可:

package com.copm.ifm.base.service.base.mapper; import com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.copm.ifm.base.basic.pojo.BaseTreePO; /** * 因為MP3.2+之后不會緩存實體類的父類字段信息,所以在使用泛型的Lambda表達式時會報錯 * {@code MybatisPlusException: can not find lambda cache for this entity [com.copm.ifm.base.basic.pojo.BaseTreePO]} * 原因是在執行{@link com.baomidou.mybatisplus.core.toolkit.LambdaUtils#getColumnMap(Class)}時 * {@code COLUMN_CACHE_MAP}中沒有{@link BaseTreePO}的信息 * * <p> * 根據源碼 * {@link com.baomidou.mybatisplus.core.MybatisMapperRegistry#addMapper(Class)} * {@link MybatisMapperAnnotationBuilder#parse()}方法的加載邏輯 * <p> * 他會將所有掃描到的mapper中的泛型({@link BaseMapper<Class>}中的Class,即實體類)的字段信息緩存到 * {@link com.baomidou.mybatisplus.core.toolkit.LambdaUtils}中的{@code COLUMN_CACHE_MAP}中。 * 但是MP3.2+之后不會加載父類的信息,所以{@code COLUMN_CACHE_MAP}中沒有相關緩存,就報錯了。 * <p> * 因此我們單獨為{@link BaseTreePO}添加一個的Mapper類,這樣他就會緩存該類的信息了。 */ public interface BaseTreeMapper extends BaseMapper<BaseTreePO> { } 

 

 

  具體原因也寫在了代碼的注釋上,這樣別人在看到這個類的時候也知道是怎么回事了。

  需要注意的是,我這里是沒有加@Mapper注解的,因為我在啟動類上加了@MapperScan注解。加了@MapperScan就不需要給每個Mapper類單獨加@Mapper了,如果你沒有加@MapperScan,則需要給他加上@Mapper


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM