当前使用版本(必填,否则不予处理)

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的简写吗