休眠HQL使用两个实体表

问题描述:

批量更新我使用这个查询在MySQL用于Table1与所述column2中的值Table2某些条件更新用于column2多个值。但我无法在hibernate更新hql中给出两个实体名称。我可以知道如何在hql中编写查询,以便它支持所有数据库。休眠HQL使用两个实体表

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

感谢, 赛义夫

+0

我的要求是用一个表中的多个记录与另一个表中的值匹配某些标准,我的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写这个查询谢谢,赛义夫。 – Saif 2013-02-28 07:02:52

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数据库中工作,但失败s在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来避免主键)。

+0

我的要求是更新多条记录,我的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是否有任何方法通过休眠来编写此查询 – Saif 2013-02-28 06:57:27

+0

我已经为您的用例添加了示例。 – 2013-02-28 08:44:57

+0

谢谢你,但如果两个表都有复合键,我们可以做这个查询。在上面的例子中,我认为ID是表A的主键。 – Saif 2013-02-28 10:11:01