7

いくつかの追加の関連付けをフェッチするには、大きなHibernateDetachedCriteriaクエリを変更する必要があります。

私のオブジェクトグラフは以下の構造に似ています。各車に関連付けられた売上を取得したいと思います。

<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>

私がやりたいことは次のようなものです:

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

しかし、setFetchModeのassociationPath引数はドット表記を無視しているようで、LazyInitializationExceptionが発生します。

原因:org.hibernate.LazyInitializationException:ロールのコレクションを遅延初期化できませんでした:Car.sales、セッションまたはセッションが閉じられていません

私は周りを検索しましたが、これまでのところ例や情報は見つかりませんでした。Hibernateのドキュメントには、ネストされた関連付けをフェッチする方法の例が記載されていません。setFetchModeのJavadoc、ドット表記アプローチが機能するはずだと示唆しているようです...

どんな助けでもいただければ幸いです。

4

1 に答える 1

19
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クエリでも、Carのインスタンスではなくコレクションを参照しているため、cars.sales無効です。cars車のコレクションで車を参照できるようにするには、参加が必要です。それがcreateAlias()呼び出しが行うことです。上記はに似ています

select showRoom from ShowRoom
left join fetch showRoom.cars car
left join fetch car.sales
于 2012-11-16T10:29:53.683 に答える