1

我在 mysql 中使用此查询来更新 in 的多个值,并在特定条件下使用column2in 中Table1的值。但我无法在休眠更新 hql 中给出两个实体名称。我能知道我必须如何在 hql 中编写下面的查询,以便它支持所有数据库。column2Table2

UPDATE Table1 A, Table2 B SET A.column2 = B.column2 WHERE A.column1 = B.column1

谢谢,赛义夫

4

1 回答 1

1

Hibernate 4.1.9 手册 - 关于批量更新和删除的部分

不能在批量 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 db 中有效,但在 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 来避免主键)。

于 2013-02-27T21:23:11.590 回答