2009-12-08 84 views
10

這個問題的最佳做法是什麼?內置有任何批處理功能嗎?如何用Nhibernate刪除多個數據庫實體?

示例代碼:

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

在此先感謝。

回答

17

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(); 
+0

如果該IDLIST巨大?你會怎樣批量生產?或者nhibernate是否有某種形式的內置配料? – Newbie 2009-12-08 19:21:07

+0

我不得不使用nHibernate profiler [nhprof.com]來設置一個測試來查看實際發送到數據庫的內容,但是如果我不得不猜測,我會說它看起來像你的硬編碼示例一樣。 – joshperry 2009-12-08 19:25:59

+2

您可以在中設置批處理大小: 100。然而,基於你的HQL,我猜測它只發出一個查詢(如果你正在循環一個集合並在其上調用Delete,批處理將適用)。 – ddango 2009-12-08 23:25:58

5

,您可以使用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(); 
9

我得到了答案,以工作中的問題,我發現下面的查詢工作100%

 Session.CreateQuery("delete Customer c where c.id in (:deleteIds)") 
      .SetParameterList("deleteIds", deleteIds) 
      .ExecuteUpdate(); 

客戶是類的名字而不是表名。 ID小寫,而在HQL是主鍵不是一個屬性名在類(屬性名稱支持)

+0

是的,可能值得一提的唯一警告是級聯不會被應用,因爲你沒有加載對象。所以,如果客戶有一個地址行連接,並且通常級聯刪除,這不會兌現 – PandaWood 2013-02-03 23:54:51