当具有相同术语的 HQL 选择有效时,为啥此 HQL 删除失败?
Posted
技术标签:
【中文标题】当具有相同术语的 HQL 选择有效时,为啥此 HQL 删除失败?【英文标题】:Why does this HQL delete fail, when an HQL select with same terms works?当具有相同术语的 HQL 选择有效时,为什么此 HQL 删除失败? 【发布时间】:2011-04-21 06:28:04 【问题描述】:为什么下面的 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();
在选择中使用相同形式的查询:
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 中删除,配置 countercon1_ 其中 UTC_TIMESTAMP<:p0 application_id=":p1;" :p0="2010">
NHibernate.Exceptions.GenericADOException: 无法执行更新查询 [SQL:
从 MYLOG 中删除,配置 countercon1_ 其中 UTC_TIMESTAMP
] ---> Oracle.DataAccess.Client.OracleException: ORA-00933: SQL 命令不正确 结束了
【问题讨论】:
docs.jboss.org/hibernate/stable/core/reference/en/html/… 你可以试试codepaste.net/nmrne1 吗?或者codepaste.net/q5m8on?如果您使用nhprof.com,它也会摇滚 + 1. 感谢 Fafael。看起来问题可能是:'不能在批量 HQL 查询中指定隐式或显式连接。子查询可以在 where 子句中使用,子查询本身可能包含连接。' 感谢代码示例。我都试过了,但我相信隐式连接会导致问题。 【参考方案1】:试试这个:
delete MyLog log
where log.id in
(select l.id
from MyLog l
where l.UtcTimestamp < :threshold and
and.Configuration.Application = :application)
【讨论】:
刚回到这个问题,你的答案第一次奏效:)【参考方案2】:来自上面Rafael提交的链接:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/batch.html#batch-direct
没有连接,无论是隐式的还是显式的, 可以在批量 HQL 查询中指定。 子查询可用于 where子句,子查询在哪里 它们本身可能包含连接
【讨论】:
【参考方案3】:语法是DELETE FROM MyLog ....
请记住,HQL 删除不支持使用 (n)hibernate 映射定义的级联。
这样你就可以选择所有的实体,然后一一删除。
【讨论】:
@Thomas The FROM 在使用DML-style operations 时确实是可选的。以上是关于当具有相同术语的 HQL 选择有效时,为啥此 HQL 删除失败?的主要内容,如果未能解决你的问题,请参考以下文章
当两个版本具有相同的行为时,为啥这个 Swift 游乐场会显示不同数量的执行? [复制]
为啥此代码有效(具有无效非模板函数的 C++ 模板类)? [复制]