Hibernate Hql使用两个实体表进行批量更新

时间:2013-02-27 11:53:22

标签: mysql database hibernate hql

我在mysql中使用此查询来更新column2Table1的多个值,并在column2 Table2的某些条件下使用UPDATE Table1 A, Table2 B SET A.column2 = B.column2 WHERE A.column1 = B.column1 中的值。但是我无法在hibernate update hql中给出两个实体名称。我可以知道如何在hql中编写下面的查询,以便它支持所有数据库。

{{1}}

谢谢, 赛义夫

1 个答案:

答案 0 :(得分:1)

来自Hibernate 4.1.9 manual - section about bulk update and deletes

  

在批量HQL查询中不能指定隐式或显式连接。   子查询可以在子查询的where子句中使用   它们本身可能包含连接。

不支持(隐式联接):

DELETE A a WHERE a.relation.property = "dummy";

一种方法:

DELETE A a WHERE a.relation.id IN (SELECT r.id FROM Relation r WHERE r.property = "dummy");

对于您的示例,它有点复杂,但后续查询应该有效(在HSQL db中测试):

UPDATE A a SET a.column3 = (SELECT b.column3 FROM B b WHERE a.column1 = b.column1 and a.column2 = b.column2) WHERE a.id IN (SELECT a.id FROM A a, B b WHERE a.column1 = b.column1 AND a.column2 = b.column2)

此查询在HSQL数据库中有效,但在MySQL中失败。看起来只有可能的解决方案是使用两个单独的查询:

List<String> list = em.createQuery("SELECT a.column1 FROM A a, B b WHERE a.column1 = b.column1 AND a.column2 = b.column2").getResultList();
em.createQuery("UPDATE A a SET a.column3 = (SELECT b.column3 FROM B b WHERE a.column1 = b.column1 and a.column2 = b.column2) WHERE a.column1 IN :list").setParameter("list", list).executeUpdate();

最后一个解决方案是在mysql中测试的并且运行良好但是在你的情况下你必须根据你的用例自定义第一个选择查询 - 我的例子期望a.column1是唯一的(使用column1而不是id来避免主键)