给定iBatis选择查询的ResultMap,似乎所有列(映射到ResultMap中的属性)实际上都是SQL查询的一部分。
但是,如果想重用ResultMaps,特别是当有' 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的容器对象和包含内部对象集合的someecollection。
但是,如果我想重用相同的结果映射定义为另一个选择查询,只需要加载容器对象(myPropName),但不需要加载内部对象(到someecollection),那么将有一个错误消息:
列名'otherColumnName'是
是否有可能允许初始化的someecollection与null或一个空的集合,如果各自的属性(在这种情况下otherPropName)不存在于SQL查询?
真的有必要为该场景创建另一个结果映射吗?
使用iBatis(不是myBatis) 2.3.4版本…
这个"问题"存在于所有的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
而不是抛出异常。
无论如何,我建议您使用两个resultmap