1

私はmysqlでこのクエリを使用して、特定の条件でinの値でinのcolumn2複数の値を更新しています。しかし、休止状態の更新hqlで2つのエンティティ名を指定することはできません。すべてのデータベースをサポートするために、hqlで以下のクエリを作成する方法を知ることができますか?Table1column2Table2

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

ありがとう、サイフ

4

1 に答える 1

1

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 でテストされ、うまく機能しますが、ユースケースに基づいて最初の選択クエリをカスタマイズする必要があります。

于 2013-02-27T21:23:11.590 に答える