質問

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

サンプルコード:

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

前もって感謝します。

役に立ちましたか?

解決

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クエリに変換され、実際にエンティティオブジェクトをロードしないため、オブジェクトで指定された関係は実行されないことに注意してください。

他のヒント

私は答えを機能させるのに問題があり、次のクエリが100%機能していることがわかりました

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

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

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

ここで削除を探してください-session.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();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top