给定iBatis select查询的ResultMap,所有列(映射到ResultMap中的属性)实际上都必须是SQL查询的一部分。
但如果想要重用ResultMaps,那会有点烦人,特别是在结果图中有'resultmaps'时。
示例:
<resultMap id="myResultMap"
<result property="myPropName" column="myColumnName"/>
<result property="someCollection" resultMap="otherResultMap"/>
</resultMap>
<resultMap id="otherResultMap" groupBy="..."
<result property="otherPropName" column="otherColumnName"/>
</resultMap>
当然,这两个结果映射是定义的,因为有一个查询使用连接来加载包含myPropName的容器对象,而someCollection包含一个内部对象的集合。
但是如果我想为另一个只需要加载容器对象(使用myPropName)的select查询重用相同的结果映射定义,但不需要加载内部对象(加入someCollection),那么就会有错误消息:
列名'otherColumnName'是 在此ResultSet中找不到
如果SQL查询中没有相应的属性(在本例中为otherPropName),是否有可能允许使用null或空集合初始化someCollection?
是否真的有必要为那个场景创建另一个结果图?
使用iBatis(不是myBatis)版本2.3.4 ...
答案 0 :(得分:6)
“问题”出现在所有TypeHandler
实现中。这些对象必须从ResultSet
中提取列值,并将其映射到相应的java类型。例如,在StringTypeHandler
类中有一个这样的方法:
public Object getResult(ResultSet rs, String columnName) throws SQLException {
Object s = rs.getString(columnName);
if (rs.wasNull()) {
return null;
} else {
return s;
}
}
如果ResultSet
中没有该列,则行rs.getString(columnName)
会抛出SQLException
。避免此错误的唯一方法是编写自己的TypeHandler
,返回null
而不是抛出异常。
无论如何,我建议你使用两个结果图。