使用子查询在set子句中更新Hibernate HQL

3
我正在尝试在Hibernate HQL中使用子查询的set子句执行更新操作,例如: update UserObject set code = (select n.code from SomeUserObject n where n.id = 1000) 但这不起作用,它是否不被支持?
谢谢。
Udo

1
它是如何失败的?你收到了什么信息? - Pascal Thivent
@Pascal:AST出现意外节点:查询...所以我认为在集合子句中不支持子查询,有什么想法吗?谢谢。 - ssedano
2个回答

4

来自Hibernate文档:

13.4. DML-style operations|13.4. DML风格操作

...

UPDATEDELETE语句的伪语法为:( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?

需要注意以下几点:

  • 在from子句中,FROM关键字是可选的。
  • 在from子句中只能命名一个实体。但是,可以给实体取别名。如果实体被取了别名,则必须使用该别名对所有属性引用进行限定。如果实体没有被取别名,则任何属性引用都无法进行限定。
  • 不能在批量HQL查询中指定任何隐式或显式的连接。但子查询可以用于where子句,在其中子查询本身可能包含连接。
  • where子句也是可选的。
虽然文档没有明确提到限制设置部分,但人们可以解释子查询仅在where子句中受支持。但是...我发现了一个四年前的问题(唉),涉及批量更新问题(HHH-1658),根据报告人的说法,以下方法可行:
UPDATE Cat c SET c.weight = (SELECT SUM(f.amount) FROM Food f WHERE f.owner = c)

我想知道在from子句中使用别名是否有帮助。看起来无论如何都有一些奇怪的地方。


3

我有同样的问题,发现你需要将批量更新放在事务中:

tr = session.getTransaction();
tr.begin();
updateQuery.executeUpdate();
tr.commit;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接