2009-12-08 10 views
10

この問題のベストプラクティスは何ですか?バッチ機能が組み込まれていますか?Nhibernateで複数のdbエンティティを削除するには?

サンプルコード:事前に

using (ITransaction transaction = _session.BeginTransaction()) 
{ 
    _session.Delete("FROM myObject o WHERE o.Id = IN(1,2,...99999)"); 
    transaction.Commit(); 
} 

感謝。

答えて

17

HQLは、IN句をサポートし、あなたが使用している場合setParameterListコレクション内を渡すことさえできます。

var idList = new List<int>() { 5,3,6,7 }; 

_session.CreateQuery("DELETE myObject o WHERE o.Id = IN (:idList)") 
    .SetParameterList("idList", idList) 
    .ExecuteUpdate(); 
+0

idListが大きい場合はどうなりますか?どうやってそれをバッチしますか?またはnhibernateに何らかの組み込みのバッチ処理がありますか? – Newbie

+0

私はnHibernateプロファイラー[nhprof.com]を使用して実際にDBに放出されるものを調べるためにテストをセットアップする必要がありましたが、もし推測しなければ、ハードコードされた例のように見えるでしょう。 – joshperry

+2

100でバッチサイズを設定できます。しかし、あなたのHQLに基づいて、私はコレクションをループしてDeleteを呼び出していた場合、一回のクエリだけが出力されると推測します(バッチが適用されます)。 – ddango

5

複数のオブジェクト

Look for delete here - for session.delete example

HQLの例をDELETEを削除するには、HQLを使用することができます(あなたがHQLで使用することができます):

ISession session = sessionFactory.OpenSession(); 
ITransaction tx = session.BeginTransaction(); 

String hqlDelete = "delete Customer c where c.name = :oldName"; 
// or String hqlDelete = "delete Customer where name = :oldName"; 
int deletedEntities = session.CreateQuery(hqlDelete) 
     .SetString("oldName", oldName) 
     .ExecuteUpdate(); 
tx.Commit(); 
session.Close(); 
9

私は答えが動作するようになって問題を抱えていたし、私は次のクエリは、

 Session.CreateQuery("delete Customer c where c.id in (:deleteIds)") 
      .SetParameterList("deleteIds", deleteIds) 
      .ExecuteUpdate(); 

お客様は、クラス名ではないテーブル名です。100%を働きました idは小文字で、HQLではクラスのプロパティ名ではない主キーです(プロパティ名はサポートされています)

+0

ええ、言及する価値があるかもしれない唯一の注意点は、カスケードはオブジェクトをロードしていないので適用されないということです。したがって、顧客に住所行が添付され、通常カスケード削除された場合、これは – PandaWood

関連する問題