8

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 に配置されています...2 番目の結果セットはMyBeanクラスに配置されています。

私のDAOのコードは次のとおりです。

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

上記の最後の行で..私のコードは失敗します。2番目のカーソルに行がなく、リストに何も入れられないため失敗します。HashMapただし、最初のカーソルも何も返しませんが、結果が最初のカーソルのリストに入れられているため、少なくともHashMapその中にオブジェクトがあります..

この違いはなぜですか?行が返されない場合でも、iBatis に MyBean のオブジェクトをリスト内に配置させる方法はありますか? それとも、DAO でこれを処理する必要がありますか... このような DAO がたくさんあるので、DAO で処理することは避けたいと思います。

4

2 に答える 2

1

結果セットが空の場合 (または、ストアド プロシージャの 3 番目のパラメーターが null を返す場合)、Ibatis はオブジェクトをインスタンス化したり返したりしません。

typeHandlers を書いているときに、結果が返されない場合は呼び出されないことに気付きました。そのため、そのルートも役に立ちません。

この場合、空のオブジェクトをインスタンス化する正当な理由があると確信していますが、唯一の方法は DAO で null を検出することです。

この問題を抱えた DAO がたくさんある場合は、それらにスーパークラスを拡張させ、そこに空のリストまたは null オブジェクトをチェックし、その場合は空のオブジェクトを返す便利なメソッドを持たせることができます。

于 2011-07-01T18:17:50.150 に答える
0

実際、私はResult1動作が正しいと信じています (結果が常に空のリストにつながるべきではありません)。

それが本当に空のカーソルであることを再確認した後Result0(たとえば、1 つのすべてのフィールドが null の行を持つカーソルとは対照的に)、iBatis のバグを探し始めるかもしれません :)

あなたの 2 番目の質問については、iBatis があなたを助けることができるとは思いません (または、そうすべきだと思います: そのようなデフォルト設定はデータベース ⇔ アプリケーション インターフェイスの一部ではないため、DAO で処理するのが最適です。または、サービス階層のさらに上で処理する必要があります)。 )。

于 2011-06-17T09:55:34.403 に答える