1

この質問では、を使用して単一の選択クエリで取得したコレクションを取得したいと考えていますfetch="join"。user.hbm ファイルに次の変更を加えました。

  <set name="phones"  table="PHONE_NUMBERS" cascade="all"  

lazy="false" fetch="join">
        <key column="UNID"/>
        <one-to-many class="PhoneNumber"/>
    </set>

それでも複数のクエリを起動します。fetch="join"両方のhbmsを追加しようとしましたが、うまくいきませんでした。何がうまくいかないのですか?

4

1 に答える 1

1

一般的に、あなたは正しいです-ドキュメントに記載されているように:

5.1.7. 1 対 1 および 1 対多の関連付けのマッピング

小引用:

... ただし、フェッチ戦略、つまり @Fetch を使用してデータをフェッチする方法を調整できます。FetchMode は、SELECT (関連付けを読み込む必要があるときに選択がトリガーされる) または JOIN (所有者エンティティを読み込むときに SQL JOIN を使用して関連付けを読み込む) にすることができます。JOIN は遅延属性をオーバーライドします(JOIN 戦略を介してロードされた関連付けは遅延することはできません)...

しかし、上記の参照された質問は、次のようにルート エンティティUSERを取得しています。

String hql = "from User ";
Query q = ses.createQuery(hql);

つまり、クエリを実行していますUser。この場合、マッピングfetch="join"は評価されません。

明示的な JOIN によってそれを行うことができます

16.3. 関連付けと結合

ドキュメントの例:

from Cat as cat
    join cat.mate as mate
    left join cat.kittens as kitten

したがって、私たちの場合:

String hql = "from User as u join u.phones as p ";
Query q = ses.createQuery(hql);

最後に - マップされた設定fetch="join"は、呼び出すたびに使用されます.get()

User user = session.get(id);
于 2014-09-13T11:15:08.967 に答える