2012-11-07 12 views
7

大規模なHibernate DetachedCriteriaクエリを変更して追加の関連付けをフェッチする必要があります。HibernateでDetachedCriteriaを使ってネストしたオブジェクトを取得しようとしています

マイオブジェクトグラフは以下の構造に似ている、私はそれぞれの車に関連した売上を取得したい:

DetachedCriteria criteria = DetachedCriteria.forClass(Showroom.class); 
// ... Existing criteria query code ... 
criteria.setFetchMode("cars.sales", FetchMode.JOIN); 

しかしassociationPath引数:

<class name="Showroom" table="showroom"> 
    ... 
    <bag name="cars" lazy="false"> 
     <one-to-many class="Car" /> 
    </bag> 
    ... 
</class> 

<class name="Car" table="car"> 
    ... 
    <set name="sales" lazy="true"> 
     <one-to-many class="Sale" /> 
    </set> 
    ... 
</class> 

私が何をしたいことのようなものですsetFetchModeでドット表記を無視して、LazyInitializationExceptionが発生するようです:

原因:org.hibe rnate.LazyInitializationExceptionは:Car.sales、無セッションまたはセッションが

を閉じた私の周りに検索し、これまでに何例かの情報を発見したしました:なまけ ロールのコレクションを初期化に失敗しました。 Hibernate documentationにはネストされた関連付けを取得する方法の例は記載されておらず、Javadoc for setFetchModeは私のドット表記のアプローチがうまくいかなければならないことを示唆しているようです...

助けてください。

答えて

15
DetachedCriteria dc = DetachedCriteria.forClass(ShowRoom.class, "showRoom"); 
criteria.setFetchMode("showRoom.cars", FetchMode.JOIN); 
criteria.createAlias("showRoom.cars", "car", CriteriaSPecification.LEFT_JOIN); 
criteria.setFetchMode("car.sales", FetchMode.JOIN); 

条件クエリにプロパティを連結することはできません。また、HQLクエリの場合でも、carsはコレクションを表し、Carのインスタンスではないため、cars.salesは無効です。車のコレクション内の車を参照するには、参加が必要です。それがcreateAlias()の呼び出しです。上記は、

select showRoom from ShowRoom 
left join fetch showRoom.cars car 
left join fetch car.sales 
+0

と似ています。私はcreateAliasがフィールドのエイリアスだけでなく結合を作成するという二重の目的を持っていたことに気づいていませんでした。 – seanhodges

関連する問題