我在 mysql 中使用此查询在某些条件下使用
column2
中的 Table1
中的值更新 column2
中 Table2
的多个值。但我无法在休眠更新 hql 中给出两个实体名称。我可以知道如何在 hql 中编写下面的查询才能支持所有数据库吗?
UPDATE Table1 A, Table2 B SET A.column2 = B.column2 WHERE A.column1 = B.column1
谢谢, 赛义夫
来自 Hibernate 4.1.9 手册 - 关于批量更新和删除的部分:
批量 HQL 查询中不能指定隐式或显式联接。 子查询可以用在where子句中,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 数据库中测试):
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 以避免主键)。