2017-03-28 16 views
0

私はこの質問を以前に尋ねました。実際には解決策に終わったわけではありませんでした。mybatisを介してSQLストアドプロシージャにJavaオブジェクトのリストを送信しますか?

私はそれに関するより良い情報を含めるつもりですので、これを複製としてフラグを立てないでください。私たちは、私は信じてここに結果マップを無視することができ、今

<select id="deleteItems" resultMap="BaseResultMap"> 
    exec [dbo].[PR_ItemsForDeletion_Delete] 
</select> 

- 私は、私は戻って取得していますどのように関係しておりませんので

今、:

は、ここに私のマッパーxmlです(まだ!)そのストアドプロシージャを参照してください?私はそれを書いていませんでした - そして、私もそのコードにアクセスすることはできません - しかし、私はそれが動作するという事実を知っています。

ストアドプロシージャには項目のリストがあります。私は、次を渡す必要があります。そのSPROCの作品を信頼

List<CustomDeletableObject> 

、およびマッパーと私はちょうどそのマッピングのXMLを実行したい - と、それにリストを渡したが、私はどこから始め絶対にないアイデアを持っていませんそれと。

事前に大喜びしていますが、私は数時間前からこれに対して頭を叩いています。 - 我々が使用するだけのIDです

プライベート長いID:

カスタム削除可能なオブジェクト・タイプは、2つのプロパティが含まれています。プライベートスティングトークン - 実際に格納しているデータ。

ストアドプロシージャでは、クエリ自体にアクセスすることはできませんが、基本的にはテーブル内のすべてのアイテムを削除します。リスト内の項目に一致するものはmyBatis 。

これは私がマッパーを呼び出すために計画しています方法です...ここで

@Override 
public boolean deleteItems(List<CustomDeletableObject> tokens){ 

    // This method handles the deletion. 
    jobMapper.deleteItems(); 

    return false; 
} 

は、私が使用しようとしていますストアドプロシージャです:セキュリティの関心では、テーブル名はナンセンスTABLEに置き換えられていますタグ。

CREATE PROCEDURE [dbo].[PR_ItemsForDeletion_Delete] 
    @pTokenList dbo.UDT_TokenDeletion READONLY 
AS 

BEGIN 
    BEGIN TRY  
     IF EXISTS (SELECT TOP 1 1 FROM @pTokenList) 
      BEGIN 
       INSERT INTO <TABLE> (Token) 
       SELECT 
        Token 
       FROM @pTokenList tl 
       WHERE NOT EXISTS 
       (
        SELECT TOP 1 1 
        FROM <TABLE> tp 
        WHERE tp.Token = tl.Token 
       ) 
      END 
    END TRY 
    BEGIN CATCH 
    ;THROW 
    END CATCH 
END 

答えて

0

あなたはBaseTypeHandler、特別setNonNullParameter方法を拡張する必要があります。 Here is example、それほど悪くはないが、もっと探す。

あなたが必要なものと思われるがTable-Valued Parameter

これは、タイプハンドラメソッドに入れて、ドライバ固有のJDBCコードである(近い)です。

コールのパラメータバインディングで型ハンドラを参照してください。

<delete id="deleteItems"> 
    exec dbo.PR_ItemsForDeletion_Delete #{list, typeHandler=com.fully.qualified.name.TokenListTypeHandler} 
</delete> 

意味的には意図的に削除していますが、技術的な影響はありませんが、キーワードを使用することをおすすめします。マップする結果がない場合、結果マップは必要ありません。

+0

本当にありがとうございます。実際のリストをストアドプロシージャに渡す方法はありません。私は配列を渡す必要がありますか? – MickeyThreeSheds

+0

第1の例は、Oracle Arrayの型ハンドラを記述することです。これは実装方法を説明するためのものであり、それに焦点を当てるのではなく、一般化してください。あなたのケースでは、リストからSQLServerDataTable(2番目のリンク)を作成し、型ハンドラの実装でコピー/ペーストしても、ほんのわずかしか適応できない場合があります。 – blackwizard

+0

ありがとうございます - 私は調査します。これは今までに一番難しいことです。私は14週間それに取り組んでいます。 :( – MickeyThreeSheds

関連する問題