记录一下Myabtis使用不规范,踩的坑.
<select id="test" resultType="com.demo.testDTO">
SELECT
t.id as id,
t.name as name,
t.phone as phone
FROM
test t
</select>
一个简单的SQL,使用Myabtis框架,返回的是resultType.这里不说规范与优缺点.
执行报
org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column 'relationCode' from result set. Cause: java.sql.SQLException:
这里报的错就是查询的字段和实体类字段类型不匹配.
直接说原因:
返回resultType的实体类中没有无参构造,但是有一个有参构造.Mybatis会根据这个构造函数的顺序,从SQL的resultSet中取出参数并设置.因为查询的字段和构造函数的参数顺序不一致,导致类型异常.
Mybatis源码
DefaultResultSetHandler类中
private Object createUsingConstructor(ResultSetWrapper rsw, Class<?> resultType, List<Class<?>> constructorArgTypes, List<Object> constructorArgs, Constructor<?> constructor) throws SQLException {
boolean foundValues = false;
for (int i = 0; i < constructor.getParameterTypes().length; i++) {
Class<?> parameterType = constructor.getParameterTypes()[i];
String columnName = rsw.getColumnNames().get(i);
TypeHandler<?> typeHandler = rsw.getTypeHandler(parameterType, columnName);
Object value = typeHandler.getResult(rsw.getResultSet(), columnName);
constructorArgTypes.add(parameterType);
constructorArgs.add(value);
foundValues = value != null || foundValues;
}
return foundValues ? objectFactory.create(resultType, constructorArgTypes, constructorArgs) : null;
}
仅此记录