为什么以下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命令不正确 结束
答案 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映射定义的级联。
因此,您可以选择所有实体并逐个删除它们。