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

标签 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:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Car.sales, no session or session was closed

我四处搜索,到目前为止没有找到任何示例或信息。 Hibernate documentation没有提供有关如何获取嵌套关联的示例,并且 Javadoc for setFetchMode似乎表明我的点符号方法应该有效......

如有任何帮助,我们将不胜感激。

最佳答案

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

关于java - 渴望在 Hibernate 中使用 DetachedCriteria 获取嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13270924/

相关文章:

mysql - 对复合唯一约束中的键重新编号

java - SQL Server 环境问题,SQL Error 207 Invalid column name sqlstate 42s22

java - 为什么 Hibernate 包含带有插入的标识字段?

java - 如何以编程方式确定连接池大小?

Mysql GROUP BY 内连接和大数据集优化

mysql - 谁是 MySQL 架构的管理员?

java - Spring批处理-通过提取自动生成的 key 写入两个表

java - 将 MonetaryAmount 转换为小单位长 (Javamoney)

java - 从解析中检索数组

java - getGender() 返回 null 与 isMale