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 查询只会转换为数据库查询并且实际上不会加载任何实体对象。

于 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 示例(您可以将 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();
于 2009-12-08T19:00:05.627 回答