iBatis ResultMaps:在此ResultSet中找不到列名<...>

Mar*_*idt 4 java ibatis resultset

给定iBatis select查询的ResultMap,所有列(映射到ResultMap中的属性)实际上都必须是SQL查询的一部分.

但是如果想要重用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>
Run Code Online (Sandbox Code Playgroud)

当然,这两个结果映射是定义的,因为有一个查询使用连接来加载包含myPropName的容器对象,而someCollection包含一个内部对象的集合.

但是,如果我想为另一个只需要加载容器对象(使用myPropName)的select查询重用相同的结果映射定义,但不需要加载内部对象(进入someCollection),那么就会出现错误消息:

在此ResultSet中找不到列名"otherColumnName"

如果SQL查询中不存在相应的属性(在本例中为otherPropName),是否有可能允许使用null或空集合初始化someCollection?

是否真的有必要为那个场景创建另一个结果图?

使用iBatis(不是myBatis)版本2.3.4 ...

jav*_*nna 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果该列中不存在ResultSet该行,则该行rs.getString(columnName)抛出a SQLException.避免此错误的唯一方法是编写自己的TypeHandler返回null而不是抛出异常.
无论如何,我建议你使用两个结果图.