如何使用Nhibernate删除多个数据库实体?

New*_*bie 12 c# nhibernate hibernate batch-file batch-processing

这个问题的最佳做法是什么?内置任何批处理功能吗?

示例代码:

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

提前致谢.

jos*_*rry 19

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();
Run Code Online (Sandbox Code Playgroud)

  • 您可以在<hibernate-configuration> <session-factory>中设置批量大小:<property name ="adonet.batch_size"> 100 </ property>.但是,根据您的HQL,我猜它只发出一个查询(如果您循环访问集合并在其上调用Delete,则批量将适用). (3认同)

Chr*_*nko 9

我有问题得到工作的答案,我发现以下查询100%工作

        Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
            .SetParameterList("deleteIds", deleteIds)
            .ExecuteUpdate();
Run Code Online (Sandbox Code Playgroud)

Customer是类名而不是表名.id是小写,在HQL中,它是主键而不是类中的属性名称(支持属性名称)


Dan*_*ani 5

您可以使用HQL删除多个对象

在这里寻找删除 - 对于session.delete示例

HQL DELETE示例(您可以使用IN和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();
Run Code Online (Sandbox Code Playgroud)