使用HQL语句按id列表删除多个记录

时间:2011-01-12 15:35:17

标签: c# nhibernate hql sql-delete

我想删除某个实体的多个记录,其中实体的id在我拥有的ID列表中。我正在尝试使用NHibernate在C#中执行此操作。

我所拥有的是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是不明确的。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

删除等号:

DELETE FROM myObject o WHERE o.Id IN :idList

答案 1 :(得分:1)

删除等号以及您的查询不正确。它应该是这样的。我建议你改用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();