2009-11-10 7 views
8

Je suis en train d'exécuter une procédure stockée qui renvoie 2 curseurs et aucun d'entre eux n'a de données. Je le xml mapping suivant:iBatis ne remplit pas l'objet lorsqu'il n'y a aucune ligne trouvée

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

Le premier jeu de résultat est mis dans une HashMap ... deuxième resultSet est mis dans une classe MyBean.

Code

dans mon OAC suit:

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 

dans la dernière ligne above..my échoue code. Il échoue parce que le deuxième curseur n'a pas de lignes et c'est pourquoi rien n'est mis dans la liste. Cependant, le premier curseur ne retourne rien aussi mais comme les résultats sont mis dans une HashMap la liste du premier curseur au moins a HashMap objet à l'intérieur ..

Pourquoi cette différence? Y at-il un moyen de rendre iBatis mettre un objet de MyBean dans la liste même s'il n'y a pas de lignes retournées? Ou devrais-je gérer cela dans mon DAO ... Je veux éviter de le traiter dans le DAO parce que j'ai tout un tas de DAO comme ceux-ci.

Répondre

0

En fait, je crois Result1 comportement est le bon (aucun résultat ne devrait toujours conduire à une liste vide).

Après avoir vérifié que Result0 est vraiment un curseur vide (par opposition à - par exemple - un curseur avec une ligne all-fields-are-null), je suppose que vous pouvez commencer à chercher un bogue dans En ce qui concerne votre deuxième question, je ne crois pas que iBatis peut vous aider (ou qu'il devrait: tel défaut ne fait pas partie de l'interface d'application de la base de données ⇔ et devrait donc être mieux géré dans le DAO - ou peut-être même plus loin dans la hiérarchie de vos services).

1

Ibatis n'instancie pas ou ne renvoie pas d'objets si le jeu de résultats est vide (ou dans votre cas, si le troisième paramètre de votre procédure stockée renvoie null).

J'ai remarqué lors de l'écriture de typeHandlers qu'ils ne sont même pas appelés quand aucun résultat n'est retourné, de sorte que la route n'aidera pas non plus.

Je suis sûr que vous avez de bonnes raisons d'instancier des objets vides dans ce cas, mais je crains que le seul moyen est de détecter des valeurs nulles dans votre DAO. Si vous avez beaucoup de DAO avec ce problème, vous pouvez leur demander d'étendre une super-classe et d'y avoir une méthode pratique qui vérifie la présence d'une liste vide ou d'un objet nul et renvoie un objet vide dans ce cas.