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

ulmd4ohb  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(183)

我在mysql中使用这个查询来更新Table1中的column2的多个值,在一定条件下使用Table2中的column2中的值。但我不能给予两个实体名称在hibernate更新hql。我可以知道我如何写下面的查询在hql,使它支持所有数据库。

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

谢了,赛义夫

pu82cl6c

pu82cl6c1#

来自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是唯一的(使用column 1而不是id来避免主键)。

相关问题