這個問題的最佳做法是什麼?內置有任何批處理功能嗎?如何用Nhibernate刪除多個數據庫實體?
示例代碼:
using (ITransaction transaction = _session.BeginTransaction())
{
_session.Delete("FROM myObject o WHERE o.Id = IN(1,2,...99999)");
transaction.Commit();
}
在此先感謝。
這個問題的最佳做法是什麼?內置有任何批處理功能嗎?如何用Nhibernate刪除多個數據庫實體?
示例代碼:
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 myObject o WHERE o.Id = IN (:idList)")
.SetParameterList("idList", idList)
.ExecuteUpdate();
,您可以使用HQL刪除多個對象
Look for delete here - for session.delete example
HQL DELETE例子(你可以用與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();
我得到了答案,以工作中的問題,我發現下面的查詢工作100%
Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
.SetParameterList("deleteIds", deleteIds)
.ExecuteUpdate();
客戶是類的名字而不是表名。 ID小寫,而在HQL是主鍵不是一個屬性名在類(屬性名稱支持)
是的,可能值得一提的唯一警告是級聯不會被應用,因爲你沒有加載對象。所以,如果客戶有一個地址行連接,並且通常級聯刪除,這不會兌現 – PandaWood 2013-02-03 23:54:51
如果該IDLIST巨大?你會怎樣批量生產?或者nhibernate是否有某種形式的內置配料? – Newbie 2009-12-08 19:21:07
我不得不使用nHibernate profiler [nhprof.com]來設置一個測試來查看實際發送到數據庫的內容,但是如果我不得不猜測,我會說它看起來像你的硬編碼示例一樣。 – joshperry 2009-12-08 19:25:59
您可以在中設置批處理大小: 100 。然而,基於你的HQL,我猜測它只發出一個查詢(如果你正在循環一個集合並在其上調用Delete,批處理將適用)。 –
ddango
2009-12-08 23:25:58