这个问题的最佳实践是什么?是否有内置的批处理功能?

示例代码:

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