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 では失敗します。唯一可能な解決策は、2 つの別々のクエリを使用することです。
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 でテストされ、うまく機能しますが、ユースケースに基づいて最初の選択クエリをカスタマイズする必要があります。