14

この問題のベストプラクティスは何ですか? 組み込みのバッチ処理機能はありますか?

サンプルコード:

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

前もって感謝します。

4

3 に答える 3

20

HQL は IN 句をサポートしており、setParameterList を使用すると、コレクションを渡すこともできます。

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

_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
    .SetParameterList("idList", idList)
    .ExecuteUpdate();

コメントで ddango が述べたように、HQL クエリの実行は単に DB クエリに変換され、実際にはエンティティ オブジェクトをロードしないため、オブジェクトで指定されたリレーションシップ カスケードは実行されないことに注意してください。

于 2009-12-08T19:17:26.597 に答える
10

答えを得るのに問題がありましたが、次のクエリが 100% 機能することがわかりました

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

Customer はテーブル名ではなくクラス名です。id は小文字で、HQL ではクラスのプロパティ名ではなく主キーです (プロパティ名はサポートされています)。

于 2011-06-12T17:38:55.003 に答える
5

HQLを使用して複数のオブジェクトを削除できます

ここで削除を探します-session.deleteの例

HQL DELETEの例(HQLでINを使用できます):

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();
于 2009-12-08T19:00:05.627 に答える