fix: optimize and close #I98ZO9

This commit is contained in:
Michael Yang 2024-03-16 09:58:52 +08:00
parent 05190c671a
commit b98134ebe8

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.mybatis;
import com.mybatisflex.core.util.MapUtil;
import org.apache.ibatis.annotations.AutomapConstructor;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.binding.MapperMethod.ParamMap;
@ -41,9 +42,9 @@ import org.apache.ibatis.session.*;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.type.TypeHandlerRegistry;
import com.mybatisflex.core.util.MapUtil;
import java.lang.reflect.Constructor;
import java.lang.reflect.Executable;
import java.lang.reflect.Parameter;
import java.sql.CallableStatement;
import java.sql.ResultSet;
@ -778,13 +779,18 @@ public class FlexDefaultResultSetHandler extends DefaultResultSetHandler {
private boolean applyColumnOrderBasedConstructorAutomapping(ResultSetWrapper rsw, List<Class<?>> constructorArgTypes,
List<Object> constructorArgs, Constructor<?> constructor, boolean foundValues) throws SQLException {
// fixed IndexOutOfBoundsException
// https://gitee.com/mybatis-flex/mybatis-flex/issues/I98ZO9
if (rsw.getColumnNames().size() < constructor.getParameterCount()) {
throw new IllegalArgumentException("Can not invoke the constructor[" + buildMethodString(constructor) + "] with value names: "
+ Arrays.toString(rsw.getColumnNames().toArray()) + ",\n"
+ "Perhaps you can add a default (no parameters) constructor to fix it."
);
}
for (int i = 0; i < constructor.getParameterTypes().length; i++) {
Class<?> parameterType = constructor.getParameterTypes()[i];
// https://github.com/mybatis-flex/mybatis-flex/pull/201
// Parameter parameter = constructor.getParameters()[i];
// String columnName = StringUtil.camelToUnderline(parameter.getName());
String columnName = rsw.getColumnNames().get(i);
TypeHandler<?> typeHandler = rsw.getTypeHandler(parameterType, columnName);
Object value = typeHandler.getResult(rsw.getResultSet(), columnName);
@ -795,6 +801,27 @@ public class FlexDefaultResultSetHandler extends DefaultResultSetHandler {
return foundValues;
}
private static String buildMethodString(Executable method) {
StringBuilder sb = new StringBuilder()
.append(method.getDeclaringClass().getName())
.append(".")
.append(method.getName())
.append("(");
Class<?>[] params = method.getParameterTypes();
int in = 0;
for (Class<?> clazz : params) {
sb.append(clazz.getName());
if (++in < params.length) {
sb.append(",");
}
}
return sb.append(")").toString();
}
private boolean applyArgNameBasedConstructorAutoMapping(ResultSetWrapper rsw, ResultMap resultMap,
String columnPrefix, List<Class<?>> constructorArgTypes, List<Object> constructorArgs, Constructor<?> constructor,
boolean foundValues) throws SQLException {