2009-11-10 11 views
8

Estoy ejecutando un procedimiento almacenado que devuelve 2 cursores y ninguno de ellos tiene datos. tengo el siguiente código XML de mapeo:iBatis no rellena objeto cuando no hay filas encontradas

<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> 

primer conjunto de resultados se está poniendo en un HashMap ... segundo conjunto resultado se ser puesto en una clase MyBean.

código en mi DAO sigue:

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 

en la última línea above..my código falla. Falla porque el segundo cursor no tiene filas y es por eso que nada se pone en la lista. Sin embargo, el primer cursor no devuelve nada pero, como los resultados se ponen en un HashMap, la lista del primer cursor al menos tiene HashMap objeto dentro de ella ..

¿Por qué esta diferencia? ¿Hay alguna manera de hacer que iBatis ponga un objeto de MyBean dentro de la lista, incluso si no se devuelven las filas? O debería manejar esto en mi DAO ... Quiero evitar manejarlo en el DAO porque tengo un montón de DAO como estos.

Respuesta

0

En realidad creo que el comportamiento de Result1 es el correcto (los resultados no siempre deben llevar a una lista vacía).

Después de haber verificado que Result0 es realmente un cursor vacío (en lugar de, por ejemplo, un cursor con una fila de todos los campos es nulo), supongo que puede comenzar a buscar un error en iBatis :)

En cuanto a su segunda pregunta, no creo que iBatis pueda ayudarlo (o que debería: tal incumplimiento no es parte de la base de datos de la base de datos ⇔ y debería manejarse mejor en DAO - o tal vez incluso más arriba en la jerarquía de servicios).

1

Ibatis no crea ni devuelve objetos si el conjunto de resultados está vacío (o en su caso, si el tercer parámetro de su procedimiento almacenado devuelve nulo).

Me di cuenta al escribir typeHandlers que ni siquiera reciben una llamada cuando no se devuelve ningún resultado, por lo que esa ruta tampoco ayudará.

Estoy seguro de que tiene buenas razones para crear instancias de objetos vacíos en este caso, pero me temo que la única forma es detectar nulos en su DAO.

Si tiene muchos DAO con este problema, puede hacer que extiendan una superclase, y tienen un método práctico que comprueba si hay una lista vacía o un objeto nulo y devuelve un objeto vacío en ese caso.

Cuestiones relacionadas