Explorar el Código

fix(AbstractLambdaWrapper.java): 变更 lombok 字段解析类型,不再使用方法的实现者类型,而是获取方法所在实例的类型

lambda 表达式中获取字段时,方法实现者可能为父类,但是表却绑定在子类上,所以部分实体类会出现表字段解析不到的问题
hanchunlin@aliyun.com hace 6 años
padre
commit
7f3ec7a0f4

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractLambdaWrapper.java

@@ -80,7 +80,7 @@ public abstract class AbstractLambdaWrapper<T, Children extends AbstractLambdaWr
     private String getColumn(SerializedLambda lambda, boolean onlyColumn) throws MybatisPlusException {
         String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName());
 
-        return Optional.ofNullable(LambdaUtils.getColumnOfProperty(lambda.getImplClass(), fieldName))
+        return Optional.ofNullable(LambdaUtils.getColumnOfProperty(lambda.getInstantiatedMethodType(), fieldName))
             .map(onlyColumn ? ColumnCache::getColumn : ColumnCache::getColumnSelect)
             .orElseThrow(() ->
                 ExceptionUtils.mpe("Your property named \"%s\" cannot find the corresponding database column name!", fieldName)

+ 12 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/support/SerializedLambda.java

@@ -20,6 +20,8 @@ import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
 
 import java.io.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 这个类是从 {@link java.lang.invoke.SerializedLambda} 里面 copy 过来的,
@@ -114,6 +116,16 @@ public class SerializedLambda implements Serializable {
         return name.replace('/', '.');
     }
 
+    private static final Pattern INSTANTIATED_METHOD_TYPE = Pattern.compile("\\(L(?<instantiatedMethodType>[\\S&&[^;)]]+);\\)L[\\S]+;");
+
+    public Class getInstantiatedMethodType() {
+        Matcher matcher = INSTANTIATED_METHOD_TYPE.matcher(instantiatedMethodType);
+        if (matcher.find()) {
+            return ClassUtils.toClassConfident(normalName(matcher.group("instantiatedMethodType")));
+        }
+        throw ExceptionUtils.mpe("无法从 %s 解析调用实例。。。", instantiatedMethodType);
+    }
+
     /**
      * @return 字符串形式
      */

+ 14 - 1
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/toolkit/LambdaUtilsTest.java

@@ -18,7 +18,6 @@ package com.baomidou.mybatisplus.core.toolkit;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
 import lombok.Getter;
-
 import org.apache.ibatis.reflection.property.PropertyNamer;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -47,6 +46,20 @@ class LambdaUtilsTest {
         }};
     }
 
+    /**
+     * 在 Java 中,一般来讲,只要是泛型,肯定是引用类型,但是为了避免翻车,还是测试一下
+     */
+    @Test
+    void test() {
+        assertInstantiatedMethodTypeIsReference(LambdaUtils.resolve(TestPojo::getId));
+        assertInstantiatedMethodTypeIsReference(LambdaUtils.resolve(Integer::byteValue));
+    }
+
+    private void assertInstantiatedMethodTypeIsReference(SerializedLambda lambda) {
+        Assertions.assertNotNull(lambda.getInstantiatedMethodType());
+    }
+
+
     @Getter
     private class TestPojo {
 

+ 2 - 4
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

@@ -16,12 +16,11 @@
 package com.baomidou.mybatisplus.test.h2;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.test.h2.enums.AgeEnum;
 import com.baomidou.mybatisplus.test.h2.entity.H2User;
+import com.baomidou.mybatisplus.test.h2.enums.AgeEnum;
 import com.baomidou.mybatisplus.test.h2.service.IH2UserService;
 import org.junit.jupiter.api.*;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -50,7 +49,6 @@ class H2UserTest extends BaseTest {
     @Autowired
     protected IH2UserService userService;
 
-
     @Test
     @Order(1)
     void testInsertMy() {
@@ -83,7 +81,7 @@ class H2UserTest extends BaseTest {
     @Order(6)
     void testSelectLambdaById() {
         H2User h2User = userService.getOne(Wrappers.<H2User>lambdaQuery().eq(H2User::getTestId, 101));
-        Assertions.assertTrue(null != h2User);
+        Assertions.assertNotNull(h2User);
     }
 
     @Test