【问题标题】:Eager fetching nested object with DetachedCriteria in Hibernate渴望在 Hibernate 中使用 DetachedCriteria 获取嵌套对象
【发布时间】:2012-11-07 13:37:23
【问题描述】:

我必须修改一个大型 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 似乎表明我的点符号方法应该有效...

任何帮助将不胜感激。

【问题讨论】:

    标签: java database hibernate detachedcriteria


    【解决方案1】:
    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
    

    【讨论】:

    • 完美,感谢您的解释。我没有意识到 createAlias 具有创建连接和字段别名的双重目的。
    猜你喜欢
    • 2012-04-30
    • 2011-04-28
    • 2012-08-21
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多