当具有相同术语的HQL选择有效时,为什么此HQL删除失败?

时间:2010-10-05 11:45:48

标签: nhibernate fluent-nhibernate hql ora-00933 hql-delete

为什么以下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_,其中UTC_TIMESTAMP&lt;:p0   和APPLICATION_ID =:p1; :p0 =   04/10/2010 17:15:52,:p1 = 7

     

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

     

从MYLOG,CONFIGURATION中删除   countercon1_,其中UTC_TIMESTAMP&lt; ?和   APPLICATION_ID =?

     

] ---&gt;   Oracle.DataAccess.Client.OracleException:   ORA-00933:SQL命令不正确   结束

3 个答案:

答案 0 :(得分:5)

试试这个:

delete MyLog log
where log.id in
          (select l.id
           from MyLog l
           where l.UtcTimestamp < :threshold and
           and.Configuration.Application = :application)

答案 1 :(得分:3)

从Rafael上面提交的链接:

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

  

没有隐式或显式的连接,   可以在批量HQL查询中指定。   可以在子查询中使用子查询   where子句,子查询所在的位置   他们自己可能包含联接

答案 2 :(得分:2)

语法为DELETE FROM MyLog ....

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

因此,您可以选择所有实体并逐个删除它们。