2009-11-10 38 views
8

我正在运行一个返回2个游标的存储过程,它们都没有任何数据。 我有以下XML映射:当没有找到行时,iBatis没有填充对象

<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 
在最后一行

above..my代码失败。它失败,因为第二个游标没有行,这就是为什么没有放入列表。然而,第一光标不返回任何内容很好,但因为结果被放入HashMap名单第一光标ATLEAST在其内部具有HashMap对象..

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

回答

0

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

当你仔细检查Result0是否真的是一个空的游标(而不是 - 例如 - 一个游标有一个all-fields-are-null的行)后,我想你可能会开始寻找一个bug iBatis :)

至于你的第二个问题,我不认为iBatis可以帮助你(或者它应该:这种默认不是数据库应用程序接口的一部分,所以最好在DAO中处理 - 或者甚至可能进一步提升您的服务层次)。

1

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

我注意到在编写typeHandlers时,如果没有返回结果,它们甚至不会被调用,所以路由也无济于事。我敢肯定,在这种情况下,你有充分的理由来实例化空对象,但是恐怕唯一的办法就是检测你的DAO中的空值。

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