iBatis ResultMaps:在此结果集中找不到列名 <...>



给定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

相关内容

  • 没有找到相关文章

最新更新