2011-01-12 39 views
7

我想刪除某個實體的ID在ID列表中的實體的多個記錄。我想用NHibernate在C#中執行此操作。使用HQL語句刪除ID列表中的多條記錄

我所擁有的是一個ID列表。

我想要做一些與此類似:

var idList = new List<Guid>() { Guid.NewGuid(),Guid.NewGuid()}; 

_session.CreateQuery("DELETE FROM MapsItem o WHERE o.Id = IN :idList") 
    .SetParameterList("idList", idList) 
    .ExecuteUpdate(); 

這將導致到以下錯誤:

Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. near line 1, column 33 [DELETE FROM Album o WHERE o.Id = IN :idList] 

查詢是HQL語句。

HQL查詢出了什麼問題。

上述問題提供的兩個答案都給出了正確的解決方案。但是,當我執行HQL時,錯誤如下:

could not insert/select ids for bulk delete[SQL: insert into #MapsItem SELECT mapsitem0_.Id as Id FROM MapsItem mapsitem0_ inner join BaseEntity mapsitem0_1_ on mapsitem0_.Id=mapsitem0_1_.Id WHERE Id in (? , ? , ? , ? , ? , ?)] 

實體MapsItem派生自實體BaseEntity。數據庫中都有一個屬性Id。 SQL查詢無法執行,因爲WHERE子句中的列ID是模糊的。

我該如何解決這個問題?

+0

同時使用query.ExecuteUpdate – Silviu 2011-07-28 13:50:04

+1

您需要回落到SQL試圖批量更新派生的元素我遇到了同樣的問題(不明確的列名「身份證」)! – Rippo 2012-04-12 15:31:04

回答

5

刪除等號:

DELETE FROM myObject o WHERE o.Id IN :idList 
+0

即使()將被添加:idList – Gutek 2011-06-15 10:30:25

1

刪除等號簽署,也是你的inquery不正確。它應該是這樣的。我建議你改用string.Format。

var idList = new List<Guid>() { Guid.NewGuid(),Guid.NewGuid()}; 

_session.CreateQuery(string.Format("DELETE FROM myObject o WHERE o.Id IN  
({0})",string.Join(",",idList.ToArray()))).ExecuteUpdate();