当具有相同术语的 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 游乐场会显示不同数量的执行? [复制]

HQL查询——HQL查询的基本用法

为啥此代码有效(具有无效非模板函数的 C++ 模板类)? [复制]

为啥我不能在angularjs中以两种方式绑定指令组件具有相同的名称?

为啥我使用有效的 withLatestFrom 操作从选择器获取具有动作观察者属性的对象?