使用set子句中的subselect进行Hibernate HQL更新

时间:2010-07-19 12:21:09

标签: java hibernate hql orm

我正在尝试使用set子句中的subselect在hibernate HQL中进行更新,如:

update UserObject set code = (select n.code from SomeUserObject n where n.id = 1000)

它不工作,不支持?

由于

2 个答案:

答案 0 :(得分:3)

来自Hibernate文档:

  

13.4. DML-style operations

     

...

     

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

     

需要注意的一些要点:

     
      
  • 在from-clause中,UPDATE Cat c SET c.weight = (SELECT SUM(f.amount) FROM Food f WHERE f.owner = c) 关键字是可选的
  •   
  • 在from子句中只能有一个实体。它可以,   但是,别名。如果是实体   name是别名,然后是任何属性   参考必须使用合格   别名。如果实体名称不是   别名,然后它是非法的   属性引用是合格的。
  •   
  • 无法在批量中指定隐式或显式的连接   HQL查询。 可以使用子查询   在where子句中,其中   子查询本身可能包含   联接。
  •   
  • where子句也是可选的。
  •   

虽然文档没有明确提到对set set的限制,但可以解释只在where子句中支持子查询。但是......

我发现了一个关于批量更新问题的4年(叹息)问题(HHH-1658),据记者了解,以下工作:

{{1}}

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

答案 1 :(得分:3)

我遇到了同样的问题,发现你需要在交易中放置批量更新:

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