2012-02-22 7 views
4

Wは、3レベル以上の参加フェッチしようとしていた。FETCH JOINの最大深さ?

JOIN FETCH entity1.collection1.collection2 // two OneToMany relations 

をしかし得た:それはあまりにも深かったので

org.hibernate.HibernateException: Errors in named queries: [...] 

はそれです、またはコレクションのコレクションは、この方法をフェッチすることができないため?これが関連している場合、私の最大フェッチ深度は3です。

私は、同時に、トリプルJOINは、他の側からFETCH行うことができます。

JOIN FETCH entity3.entity2.entity1 // two ManyToOne relations 

どういうわけか、私はの深さを制限すること、JPA仕様で、またはHibernateのドキュメントに何かを見つけることができませんこの句。

+0

例外のメッセージを含めてください。通常、エラーの理由を示します。 –

+0

本当に存在するものはありません。スタックトレースはGlassfishによってカットされますが、一番上の例外は上記で引用した例外に起因する「EntityManagerFactoryをビルドできません」です。 – MaDa

答えて

4

collection1は、タイプCollectionです。 Collectionにはcollection2フィールドがありません。それで、私はそのような種類の質問について私がどう考えているのですか。これはデカルト積を生成し、ひいてはpetentially行の膨大な数を返すということ

select e from Entity1 e 
left join fetch e.collection1 as c1 
left join fetch c1.collection2 as c2 

注:あなたが明示的に作成する必要があります

は、コレクションの上に参加します。また、2つのコレクションのうちの1つが少なくともセットである場合にのみ可能であることに注意してください。それらが両方ともバッグである場合、Hibernateはクエリを実行するときに例外をスローします。

+0

しかし、collection2はEntity1から参照されません。それはCollection1フィールドの1つです: 'List collection2'。したがって、クエリは正しくありません。 – MaDa

+0

申し訳ありません。打ち間違え。私の編集された答えを見てください。 –

+0

別名で結合フェッチを行うことはできないと思うので、 'left join fetch e.collection1'または' left join e.collection1 as c1'のどちらかです。 –

関連する問題