mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 09:08:24 +08:00
fix: optimize and close #I98ZO9
This commit is contained in:
parent
05190c671a
commit
b98134ebe8
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user