3

为什么以下 HQL 查询失败?

string hql = @"delete MyLog log
               where
                    log.UtcTimestamp < :threshold and
                    log.Configuration.Application = :application";

session.CreateQuery(hql)
       .SetDateTime("threshold", threshold)
       .SetEnum("application", this.application)
       .ExecuteUpdate();

在 select 中使用相同形式的查询:

string hql = @"from MyLog log
               where
                    log.UtcTimestamp < :threshold and
                    log.Configuration.Application = :application";
IList<MyLog> log = session.CreateQuery(hql)
    .SetDateTime("threshold", threshold)
    .SetEnum("application", this.application)
    .List<MyLog>();

MyLog 的映射包含:

References(x => x.Configuration)
     .Columns("CONFIGURATION_ID")
     .ReadOnly();      

配置的映射包含:

Map(x => x.Application, "APPLICATION_ID");

我得到的错误是:

从 MYLOG 中删除,CONFIGURATION countercon1_ where UTC_TIMESTAMP<:p0 and APPLICATION_ID=:p1; :p0 = 04/10/2010 17:15:52, :p1 = 7

NHibernate.Exceptions.GenericADOException:无法执行更新查询 [SQL:

从 MYLOG 中删除 CONFIGURATION countercon1_ where UTC_TIMESTAMP< ? 和 APPLICATION_ID= ?

] ---> Oracle.DataAccess.Client.OracleException: ORA-00933: SQL 命令未正确结束

4

3 回答 3

5

试试这个:

delete MyLog log
where log.id in
          (select l.id
           from MyLog l
           where l.UtcTimestamp < :threshold and
           and.Configuration.Application = :application)
于 2010-10-06T15:35:16.993 回答
3

从上面 Rafael 提交的链接中:

http://docs.jboss.org/hibernate/stable/core/reference/en/html/batch.html#batch-direct

不能在批量 HQL 查询中指定任何隐式或显式连接。子查询可以在 where 子句中使用,其中子查询本身可能包含连接

于 2010-10-05T14:44:51.267 回答
2

语法是DELETE FROM MyLog ....

请记住,HQL 删除不支持使用 (n)hibernate 映射定义的级联。

因此,您可以选择所有实体并一一删除。

于 2010-10-05T12:03:02.207 回答