我正在运行一个返回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中......第二个resultSet放在MyBean
类中。
代码如下:
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。
答案 0 :(得分:1)
如果结果集为空,Ibatis不会实例化或返回对象(或者在您的情况下,如果存储过程的第三个参数返回null)。
我注意到在编写typeHandler时,如果没有返回结果,它们甚至都不会被调用,因此该路由也无济于事。
我确信你有充分的理由在这种情况下实例化空对象,但我担心唯一的办法就是在你的DAO中检测空值。
如果你有很多DAO遇到这个问题,你可以让它们扩展一个超类,并在那里有一个方便的方法来检查空列表或空对象,并在这种情况下返回一个空对象。
答案 1 :(得分:0)
实际上我认为Result1
行为是正确的(没有结果应该总是导致空列表)。
在您仔细检查Result0
实际上是一个空光标(而不是 - 例如 - 一个带有一个全字段为空行的光标)之后,我猜你可能会开始寻找iBatis中的一个错误:)
关于你的第二个问题,我不相信iBatis可以帮助你(或它应该:这样的默认不是数据库⇔应用程序接口的一部分,因此最好在DAO中处理 - 或者甚至可能进一步提高您的服务层次结构)。