0

以下の単純化された例のように、サブ選択を介してリンクされた2つのibatis sqlマップがあります。

<resultMap id="order" class="Order">
  <collection property="orderLines" ofType="OrderLine" resultMap=”orderLine”/>
</resultMap>

結合と関連付けによって返される line オブジェクトのコレクションを含む order オブジェクトがあります。注文明細を返すネストされた関連付けによって返されるすべての明細に対して、いくつかの行ハンドラー機能を実行したいと考えています。

これは、OrderLine オブジェクトのリストのみのクエリのために spring sqlmapclienttemplateを呼び出すときにIListRowHandlerqueryWithRowHandler呼び出しに渡すことで実現できることを知っていますが、呼び出しを行うときにサブセレクト コレクションで行ハンドラーを使用することはできません。親の sql マップでのみ、この例の順序で。

行ハンドラ クラスを特定の結果マップまたは ibatis SQL マップ内の選択ステートメントに宣言的に割り当てる方法はありますか? これは私が感じるべき機能の種類であるため、そこにある必要があります。または、完全に構築された注文オブジェクトを調べて事後にそれらを操作するのではなく、サブ選択によって返される行オブジェクトの各インスタンスを変更することについての提案を受け入れます

4

2 に答える 2

1

私はiBatisのドキュメントを調べて、成功せずに適合するものを探しました。

だから私は次の解決策を実装しました:

Order.setOrderLines(collection orderLines)クエリ実行の結果としてibatisを介して入力されるメソッドに、に設定されようとしているコレクション内のそれぞれを操作するハンドラーメソッドを実装しましorderLinesOrder

これは、インスタンス化されてコレクションに追加される前に、ネストされた各オブジェクトのインターセプトを実現しませんが、ジョブを実行し、クエリに依存しない方法で実行するため、いつでもアクティブ化されます。 queryはOrderresultMapを戻り値として利用します。

誰かが提案した場合、私が最初に望んでいたタスクを実行する宣言型ソリューションを答えとしてマークできてうれしいです!

于 2009-12-11T09:31:33.090 に答える
1

N+1 選択アプローチを使用しているように聞こえますが、単純なクエリでも多数の選択が実行される可能性があり、通常は望ましくありません。問題の代替ソリューションを提供する iBatis ユーザー ガイドの「関連付けのネストされた結果」セクションを参照してください。基本的には、メイン クエリで結合を実行し、resultMap レベルで集計を使用してオブジェクト モデルにマップすることができます。メインクエリで行ハンドラーを使用するだけです。

于 2009-12-10T18:52:40.377 に答える