Ver Fonte

fix: 修复MyBaseServiceImpl.getSqlStatement中JDK代理类名导致MappedStatement查找失败

baseMapper.getClass()返回JDK代理类名(jdk.proxy2.$Proxy110)而非真实Mapper接口类名,
导致replaceBatch/insertIgnore等操作找不到对应的mapped statement。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline há 3 semanas atrás
pai
commit
836fd9174f

+ 11 - 2
service/src/main/java/com/kym/service/mybatisplus/MyBaseServiceImpl.java

@@ -71,8 +71,17 @@ public class MyBaseServiceImpl<M extends MyBaseMapper<T>, T> extends ServiceImpl
     }
 
     protected String getSqlStatement(MySqlMethod sqlMethod) {
-        // MyBatis-Plus 3.5.9+ mapperClass 字段变为 private,使用 baseMapper.getClass() 替代
-        return getSqlStatement(this.baseMapper.getClass(), sqlMethod);
+        return getSqlStatement(resolveMapperClass(), sqlMethod);
+    }
+
+    private Class<?> resolveMapperClass() {
+        Class<?> mapperClass = this.baseMapper.getClass();
+        for (Class<?> iface : mapperClass.getInterfaces()) {
+            if (MyBaseMapper.class.isAssignableFrom(iface) && iface != MyBaseMapper.class) {
+                return iface;
+            }
+        }
+        return mapperClass;
     }
 
     public static String getSqlStatement(Class<?> mapper, MySqlMethod sqlMethod) {