mybatis plus如何在使用lambda方式拼接查询字段,抛出ReflectionException: Error parsing property name 'lambda$doFilterInternal$a484da93$1'. Didn't start with 'is', 'get' or 'set'.异常

首先说明一件事,这里出现异常多半是代理导致的问题。
出现这个问题跟mybatisplus和springboot版本无关的问题。

mybatis-plus => 3.5.11
mybatis-plus-spring-boot3-starter => 3.5.11
springboot => 3.5.0-SNAPSHOT

SFunction<B,?> testMethod = B::getId;
LambdaMeta extract = LambdaUtils.extract(testMethod);
System.out.println("extract: " + extract.getImplMethodName());

输出的内容:extract: lambda$main$5a5be928$1
以下是断点的输出内容:

在通过Lambda拼接sql的查询字段和条件时,最终都会从com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper#getColumnCache(com.baomidou.mybatisplus.core.toolkit.support.SFunction<T,?>)方法处将lambda的字段转为属性的名称字符串。如果需要,你可以自己debug下。

前情提要补充完毕了,接下来就该说解决方法了。
就跟前文一样,这与框架无关。如果你的Entity实体类的访问修饰符(如 public、private等等)不够的话,导致其他包下的Java类文件访问不到的话,就会出现上面这种lambda$doFilterInternal$a484da93$1情况。
解决方法就把你的实体类的访问修饰符改为public即可。

这种问题是属于使用问题了。

如果你想复现这个问题,很简单,创建2个包Package(如a,b)。
a包放上面的测试代码(自建类命即可)。
b包放一个A类,放一个B类,B类继承A类,A类的访问修饰符使用默认的。
代码示例:


// A 类文件的内容
@Data
class A {
 private String id;
}

// B类文件的内容
@Data
public class B extends A {
 private String name;
}

这样运行上面的LambdaUtils所处的代码,就会出现'lambda$doFilterInternal$a484da93$1'问题了,无法提取B::getIdlambda表达式的字段属性名称内容了。

posted @ 2025-04-27 12:09  星小梦  阅读(122)  评论(0)    收藏  举报