web-dev-qa-db-ja.com

JPAEntityManagerを使用して2つの無関係なテーブルを結合します

2つの間にFK/PK関係がない場合、プロパティで2つのJPAエンティティを結合する必要があります。私はHibernateを使用しており、このようなHQLクエリを使用できます

 select foo, bar from FooEntity as foo, BarEntity as bar
 where  foo.someothercol = 'foo' and foo.somecol = bar.somecol

ただし、Hibernateへの依存を避け、代わりにEntityManagerを使用したいと思います。助けてください。

14
ajay

クエリは有効なJPQLであり、Hibernate固有の機能を使用しません(barとfromの間のスペースのみが欠落しています)。 JPA 2.0仕様(4.4.5結合)では、これは次の単語で説明されています。

内部結合は、FROM句でデカルト積を使用し、WHERE句で結合条件を使用することによって暗黙的に指定できます。結合条件がない場合、これはデカルト積になります。

この一般化されたスタイルの結合の主な使用例は、結合条件にエンティティ関係にマップされた外部キー関係が含まれていない場合です。例:SELECT c FROM Customer c、

従業員e WHERE c.hatsize = e.shoesize

クエリとの主な違いは、選択に2種類のエンティティが含まれていることです。クエリの結果は、List of Object []です。配列内の要素の順序は、selectステートメントの場合と同じです。あなたの場合、以下の作品があります:

String query =
    "select foo, bar from  FooEntity as foo, BarEntity as bar "+
    "where  foo.someothercol = 'foo' and foo.somecol = bar.somecol";
List<Object[]> results = em.createQuery(query).getResultList();

for (Object[] fooAndBar: results) {
    FooEntity foo = (FooEntity) fooAndBar[0];
    BarEntity bar = (BarEntity) fooAndBar[1];
    //do something with foo and bar
}
19
Mikko Maunu