当前使用版本(必填,否则不予处理)
3.4.3.4
该问题是如何引起的?(确定最新版也有问题再提!!!)
lambda写法不同报错
重现步骤(如果有就写完整)
LambdaQueryWrapper<FileEntity> gt = Wrappers.lambdaQuery(FileEntity.class)
.eq(fileEntity -> fileEntity.getAppId(), "test");
LambdaQueryWrapper<FileEntity> gt2 = Wrappers.lambdaQuery(FileEntity.class)
.eq(FileEntity::getAppId, "test");
报错信息
org.apache.ibatis.reflection.ReflectionException: Error parsing property name 'lambda$contextLoads$44ffad79$1'. Didn't start with 'is', 'get' or 'set'.
at org.apache.ibatis.reflection.property.PropertyNamer.methodToProperty(PropertyNamer.java:37)
at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.getColumnCache(AbstractLambdaWrapper.java:76)
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$columnToSqlSegment$a3f115af$1(AbstractWrapper.java:638)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)lam
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
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.NormalSegmentList.childrenSqlSegment(NormalSegmentList.java:89)
at com.baomidou.mybatisplus.core.conditions.segments.AbstractISegmentList.getSqlSegment(AbstractISegmentList.java:103)
at com.baomidou.mybatisplus.core.conditions.segments.MergeSegments.getSqlSegment(MergeSegments.java:72)
at com.baomidou.mybatisplus.core.conditions.AbstractWrapper.getSqlSegment(AbstractWrapper.java:587)
我debug了看了一下用方法引用可以拿到getXX方法的, 但是用第一种方法拿到是一个Lambda代理类。
Comment From: qclucky7
SFunction<FileEntity, String> getAppId = FileEntity::getAppId;
LambdaMeta extract = LambdaUtils.extract(getAppId);
System.out.println(extract.getImplMethodName());
result:
getAppId
LambdaMeta extract2 = LambdaUtils.extract((SFunction<FileEntity, String>) fileEntity -> fileEntity.getAppId());
System.out.println(extract2.getImplMethodName());
result:
lambda$contextLoads$7d1c9855$1
LambdaMeta extract23= LambdaUtils.extract(new SFunction<FileEntity, String>() {
@Override
public String apply(FileEntity object) {
return object.getAppId();
}
});
result:
报错
Comment From: kamjin1996
你是人才啊兄弟,::引用调用才能拿到字段信息,不然你lambda方法体写一堆代码,谁知道是啥子
Comment From: qclucky7
你是人才啊兄弟,::引用调用才能拿到字段信息,不然你lambda方法体写一堆代码,谁知道是啥子
是的我理解错了,我一直以为方法引用是Function的实现
Comment From: qclucky7
你是人才啊兄弟,::引用调用才能拿到字段信息,不然你lambda方法体写一堆代码,谁知道是啥子
但是我不太理解的是这个方法引用难道不是lambda的简写吗