2010-12-06 9 views
3

私はこのHQLクエリを見つけました。コメントによると、LEFT JOINはHibernateに子テーブル内の関連するエンティティを熱心にロードさせ、結果セットの重複する親エンティティをフィルタリングするためにはDISTINCT修飾子が必要であると言います。これらのコメントは理にかなっていますか?私は前にこの方法で結合を見たことがありません。Hibernate HQL:子エンティティを熱心に読み込むためにJOINを使用していますか?

SELECT DISTINCT p FROM Parent AS p 
LEFT JOIN p.children AS c 
WHERE p.state = 1 
ORDER BY p.modified 

cWHERE又はORDER BY句で使用されていません。

単純にこのクエリを置き換えることは安全だろうと思われる:

SELECT p FROM Parent AS p 
WHERE p.state = 1 
ORDER BY p.modified 

しかし、私はあるとして、元のクエリが書かれていた 正当な理由がある場合はわかりません。ドキュメントHibernateによると

答えて

3

:参加する「フェッチ」

は関連や値のコレクションが、単一の選択を使用して親オブジェクトとともに初期化することができます。これは、コレクションの場合に特に便利です。アソシエーションとコレクションのマッピングファイルの外部結合と遅延宣言を効果的にオーバーライドします。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

だから、ロードと呼ばコレクションを引き起こす参加する「フェッチ」のみです。あなたのケースでは、あなたは "フェッチ"結合を持っていないので、私は子のコレクションがこのクエリを介して読み込まれるとは思わない。

つまり、はい、2番目のクエリで置き換えることができます。

関連する問題