2009-11-10 14 views
8

Używam procedury składowanej, która zwraca 2 kursory i żadne z nich nie ma żadnych danych. Mam następujące mapowania xml:Program iBatis nie wypełnia obiektu, gdy nie znaleziono wierszy.

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

Pierwszy zestaw wyników jest umieścić w HashMap ... drugi resultSet jest umieścić w klasie MyBean.

kod w moim DAO następująco:

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 

w ostatnim wierszu above..my kod zawiedzie. Nie powiedzie się, ponieważ drugi kursor nie ma wierszy i dlatego nic nie jest wstawiane na listę. Jednak pierwszy kursor nic nie zwraca, ale ponieważ wyniki są wprowadzane do HashMap, lista pierwszego kursora ma w środku obiekt HashMap ..

Dlaczego ta różnica? czy istnieje sposób, aby iBatis umieścił obiekt MyBean na liście, nawet jeśli nie ma zwróconych wierszy? A może powinienem zajmować się tym w moim DAO ... Chcę uniknąć posługiwania się nim w DAO, ponieważ mam całą masę takich DAO.

Odpowiedz

0

Właściwie uważam, że zachowanie Result1 jest prawidłowe (żadne wyniki nie zawsze powinny prowadzić do pustej listy).

Po dwukrotnym sprawdzeniu, czy Result0 jest naprawdę pustym kursorem (w przeciwieństwie do - na przykład - kursorem z jednym wierszem wszystkie-są-zerowe wiersze), prawdopodobnie można rozpocząć polowanie na błąd w iBatis :)

Jeśli chodzi o twoje drugie pytanie, nie wierzę, że iBatis może ci pomóc (lub że powinno: takie przypadki nie są częścią interfejsu bazy danych ⇔ i dlatego najlepiej być traktowane w DAO - lub może nawet dalej w górę hierarchii usług).

1

Ibatis nie tworzy instancji ani nie zwraca obiektów, jeśli zestaw wyników jest pusty (lub w twoim przypadku, jeśli trzeci parametr procedury składowanej zwraca wartość null).

Zauważyłem podczas pisania typeHandlers, że nie są one nawet wywoływane, gdy nie jest zwracany wynik, więc trasa również nie pomoże.

Jestem pewien, że masz dobre powody, aby w tym przypadku utworzyć puste obiekty, ale obawiam się, że jedynym sposobem jest wykrycie wartości null w twoim DAO.

Jeśli masz dużo DAO z tym problemem, możesz kazać im przedłużyć superklasę i mieć tam wygodną metodę, która sprawdza pustą listę lub obiekt zerowy i zwraca pusty obiekt w takim przypadku.

Powiązane problemy