【问题标题】:Hibernate Hql for bulk update using two entity tablesHibernate Hql 使用两个实体表进行批量更新
【发布时间】:2013-02-27 11:53:22
【问题描述】:

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

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

谢谢, 赛义夫

【问题讨论】:

  • 我的要求是用另一个表中匹配某些条件的值更新一个表中的多个记录,我的 mysql 查询看起来像 UPDATE table1 A, table2 B SET A.field6 = B.field6 WHERE A .field1 = B.field1 AND A.field2 = B.field2 AND A.field3 = B.field3 AND A.field4 = B.field4 AND A.field5=B.field5 有没有办法通过休眠写这个查询谢谢,赛义夫。

标签: mysql database hibernate hql


【解决方案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 以避免主键) .

【讨论】:

  • 我的要求是更新多条记录,我的 mysql 查询看起来像 UPDATE table1 A, table2 B SET A.field6 = B.field6 WHERE A.field1 = B.field1 AND A.field2 = B。 field2 AND A.field3 = B.field3 AND A.field4 = B.field4 AND A.field5 =B.field5 有没有办法通过hibernate写这个查询
  • 我为您的用例添加了示例。
  • 谢谢..但是如果两个表都具有复合键,我们可以进行查询吗?在上面的示例中,我认为 id 是表 A 的主键。
  • 您可以将查询的 WHERE 部分更改为:a.column1 IN (SELECT a.column1 FROM A a, B b WHERE a.column1 = b.column1 AND a.column2 = b.column2) - 未经测试,但与提供的示例几乎相同,并且避免使用 id 作为主键。
  • 好的,查询适用于 hsql db 但不适用于 mysql ...有趣。它尝试使用 mysql 并添加了另一个解决方案。
猜你喜欢
  • 2016-08-12
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
相关资源
最近更新 更多