【问题标题】:iBatis not populating object when there are no rows found找不到行时,iBatis 不填充对象
【发布时间】:2009-11-10 19:23:13
【问题描述】:

我正在运行一个返回 2 个游标但没有任何数据的存储过程。 我有以下映射xml:

<resultMap id="resultMap1" class="HashMap">
  <result property="firstName" columnIndex="2"/>
</resultMap>

<resultMap id="resultMap2" class="com.somePackage.MyBean">
  <result property="unitStreetName" column="street_name"/>
</resultMap>

<parameterMap id="parmmap" class="map">
  <parameter property="id" jdbcType="String" javaType="java.lang.String" mode="IN"/>
  <parameter property="Result0" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap1"/>
  <parameter property="Result1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap2"/>
</parameterMap>

<procedure id="proc" parameterMap="parmmap">
    { call my_sp (?,?,?) }
</procedure>

第一个结果集被放入 HashMap...第二个结果集被放入 MyBean 类。

我的 DAO 中的代码如下:

HashMap map = new HashMap()
map.put("id", "1234");
getSqlMapClientTemplate().queryForList("mymap.proc", map);
HashMap result1 = (HashMap)((List)parmMap.get("Result0")).get(0);
MyBean myObject = (MyBean)((List)parmMap.get("Result1")).get(0);//code fails here

在上面的最后一行..我的代码失败了。它失败了,因为第二个游标没有行,这就是为什么没有放入列表的原因。但是,第一个游标也没有返回任何内容,但是由于结果被放入 HashMap 中,第一个游标的列表中至少有 HashMap 对象..

为什么会有这种差异?即使没有返回行,有没有办法让 iBatis 将 MyBean 的对象放入列表中?或者我应该在我的 DAO 中处理这个...我想避免在 DAO 中处理它,因为我有一大堆像这样的 DAO。

【问题讨论】:

    标签: java oracle ibatis


    【解决方案1】:

    如果结果集为空(或者在您的情况下,如果存储过程的第三个参数返回 null),Ibatis 不会实例化或返回对象。

    我在编写 typeHandler 时注意到,当没有返回结果时,它们甚至不会被调用,因此该路由也无济于事。

    我确信在这种情况下您有充分的理由实例化空对象,但恐怕唯一的方法是在您的 DAO 中检测空值。

    如果你有很多 DAO 遇到这个问题,你可以让它们扩展一个超类,并在那里有一个方便的方法来检查空列表或空对象并在这种情况下返回一个空对象。

    【讨论】:

      【解决方案2】:

      其实我相信Result1 的行为是正确的(没有结果应该总是导致一个空列表)。

      在您仔细检查 Result0 确实是一个空游标(而不是 - 例如 - 具有一个所有字段为空行的游标)之后,我想您可能会开始寻找错误在 iBatis 中:)

      至于您的第二个问题,我不相信 iBatis 可以帮助您(或者它应该:这种默认设置不是数据库的一部分 ⇔ 应用程序接口,因此最好在 DAO 中处理 - 或者甚至更进一步您的服务层次结构)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 2011-02-23
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        相关资源
        最近更新 更多