给定iBatis选择查询的ResultMap,似乎所有列(映射到ResultMap中的属性)实际上都是SQL查询的一部分。

但是,如果要重用ResultMap会有点烦人,尤其是在“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),而又不需要加载内部对象(进入someCollection)的选择查询,则会出现错误消息:



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

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

正在使用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而不是引发异常。
无论如何,我建议您使用两个结果图。

10-03 00:16