渴望在Hibernate中使用DetachedCriteria获取嵌套对象

时间:2012-11-07 13:37:24

标签: java database hibernate detachedcriteria

我必须修改一个大的Hibernate DetachedCriteria查询来获取一些额外的关联。

我的对象图类似于下面的结构,我想获取与每辆车相关的销售:

<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 documentation没有提供有关如何获取嵌套关联的示例,Javadoc for setFetchMode似乎表明我的点符号方法应该有效...

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:16)

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.sales也无效,因为cars指的是集合,而不是Car的实例。需要加入才能在汽车收藏中引用汽车。这就是createAlias()调用的作用。以上类似于

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