web-dev-qa-db-ja.com

Hibernate基準と複数結合

hibernate基準で可能ですか?

select A.something, B.something, C.something, D.something
    from  A JOIN B on A.id = B.id_fk
          JOIN C ON B.id = C.id_fk
          JOIN D ON C.id = D.id_fk;
13

私はまったく同じ問題を抱えており、次のように解決することができました:

return criteria.createCriteria(A.class)
               .createCriteria("b", "join_between_a_b")
               .createCriteria("c", "join_between_b_c")
               .createCriteria("d", "join_between_c_d")
               .add(Restrictions.eq("some_field_of_D", someValue));

注:上記のコードの"b""c"、および"d"は、それぞれAB、およびCクラスの属性名を参照しています。 (クラスAには属性bなどがあります)。

このソリューションでは、A.hbm.xmllazyおよびfetchパラメーターを設定する必要はありません。

17
mindas

Hibernateリファレンスマテリアル には、setFetchModeを使用して外部結合との関連付けをフェッチすることを示すいくつかの良い例があります。

例は次のとおりです。

List books = sess.createCriteria(Book.class)
.setFetchMode("chapters", FetchMode.EAGER)
.setFetchMode("reviews", FetchMode.EAGER)
.list();

さまざまなフェッチ戦略に関する情報 もあります。これはあなたに役立つかもしれません。

2
Rachel

次のように、条件でフェッチモードを設定してみてください。

criteria.setFetchMode(..., FetchMode.EAGER)

これにより、結合クエリが作成されます。あなたはより多くの詳細を見つけるかもしれません ここ

1
Péter Török

はい、実際、これを行うにはいくつかの方法があります。

  1. アソシエーションをマッピングするときは、レイジーネスをfalseに設定し、フェッチモードを参加に設定します。これは、すべての基準クエリに影響します。
  2. 他の回答で詳しく説明されているように、setFetchModeを使用します。
  3. Criteria.createAlias(またはcreateCriteria)を使用します。これにより、結合する行をさらに制限することもできます。
0
meriton