这个问题的最佳实践是什么?有内置的批处理功能吗?
示例代码:
using (ITransaction transaction = _session.BeginTransaction())
{
_session.Delete("FROM myObject o WHERE o.Id = IN(1,2,...99999)");
transaction.Commit();
}
提前致谢。
这个问题的最佳实践是什么?有内置的批处理功能吗?
示例代码:
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 查询只会转换为数据库查询并且实际上不会加载任何实体对象。
我在获得工作答案时遇到问题,我发现以下查询 100% 有效
Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
.SetParameterList("deleteIds", deleteIds)
.ExecuteUpdate();
Customer 是类名而不是表名。id 是小写的,在 HQL 中它是主键而不是类中的属性名称(支持属性名称)
您可以使用 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();