2009-11-10 5 views
8

Ich führe eine gespeicherte Prozedur aus, die 2 Cursor zurückgibt und keine von ihnen hat Daten. Ich habe die folgende Abbildung xml:iBatis füllt kein Objekt, wenn keine Zeilen gefunden werden

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

erstes Ergebnis in einer HashMap gesetzt wird ... zweite resultSet in einer MyBean Klasse gesetzt wird.

Code in meinem DAO folgt:

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 

in der letzten Zeile above..my Code fehlschlägt. Es schlägt fehl, weil der zweite Cursor keine Zeilen hat und deshalb nichts in die Liste eingetragen wird. Der erste Cursor gibt jedoch auch nichts zurück, aber da die Ergebnisse in eine HashMap eingegeben werden, hat die Liste für den ersten Cursor zumindest HashMap Objekt darin.

Warum dieser Unterschied? Gibt es eine Möglichkeit, iBatis ein Objekt von MyBean in die Liste zu setzen, selbst wenn keine Zeilen zurückgegeben werden? Oder sollte ich das in meiner DAO behandeln? Ich möchte vermeiden, es in der DAO zu handhaben, weil ich eine ganze Menge DAO's habe.

Antwort

0

Eigentlich glaube ich Result1 Verhalten ist das richtige (keine Ergebnisse sollten immer zu einer leeren Liste führen).

Nachdem Sie überprüft haben, dass Result0 ist wirklich ein leerer Cursor (im Gegensatz zu - zum Beispiel - ein Cursor mit einer Zeile alle-Felder-sind-null), ich denke, Sie können beginnen, nach einem Fehler zu suchen iBatis :)

Wie für Ihre zweite Frage, ich glaube nicht, dass iBatis Ihnen helfen kann (oder dass es sollte: solche Standardeinstellungen ist nicht Teil der Datenbank ⇔ Anwendungsschnittstelle und sollte daher am besten in der DAO behandelt werden - oder vielleicht sogar noch weiter oben in Ihrer Service-Hierarchie).

1

Ibatis instanziiert oder gibt keine Objekte zurück, wenn das Resultset leer ist (oder in Ihrem Fall, wenn der dritte Parameter der gespeicherten Prozedur null zurückgibt).

Ich bemerkte beim Schreiben von TypHandlers, dass sie nicht einmal aufgerufen werden, wenn kein Ergebnis zurückgegeben wird, so dass die Route auch nicht hilft.

Ich bin sicher, dass Sie gute Gründe haben, in diesem Fall leere Objekte zu instanziieren, aber ich fürchte, der einzige Weg besteht darin, Nullen in Ihrem DAO zu erkennen.

Wenn Sie viele DAOs mit diesem Problem haben, könnten Sie sie eine Oberklasse erweitern lassen und eine bequeme Methode haben, die nach einer leeren Liste oder einem Null-Objekt sucht und in diesem Fall ein leeres Objekt zurückgibt.