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

问题描述 投票:0回答:1

我在 mysql 中使用此查询在某些条件下使用

column2
中的
Table1
中的值更新
column2
Table2
的多个值。但我无法在休眠更新 hql 中给出两个实体名称。我可以知道如何在 hql 中编写下面的查询才能支持所有数据库吗?

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

谢谢, 赛义夫

mysql database hibernate hql
1个回答
1
投票

来自 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 以避免主键)。

© www.soinside.com 2019 - 2024. All rights reserved.