HQL Fetch Join 不知道对象实现

Posted

技术标签:

【中文标题】HQL Fetch Join 不知道对象实现【英文标题】:HQL Fetch Join without knowing object implementation 【发布时间】:2020-08-08 01:07:19 【问题描述】:

我遇到了性能问题,我正在尝试添加一些 fetch join 以仅在一个请求中获取一些数据。

我的问题是: 我得到了一个映射对象AbstractObject。 而且我还得到了其他映射对象,例如ObjectAObjectB 等……都在扩展AbstractObject

在我的ObjectA 中,我得到了foos 的列表。 在我的ObjectB 中,我得到了otherFoos 的列表。

我正在尝试做的事情: 我想写一个这样的请求:

entityManager.createQuery("SELECT ao FROM AbstractObject ao LEFT JOIN FETCH ao.foos LEFT JOIN FETCH ao.otherFoos WHERE ao.id = ?1", AbstractObject.class)

问题:我得到了一个nullPointerException,因为我认为hibernate 不知道foosotherFoosAbstractObject。 在我看来,我不知道我是否会有ObjectAObjectB

有人知道这个问题的解决方案吗?

休眠版本:5.0.12.Final

【问题讨论】:

附加信息:我不想使用复活节解决方案总是得到 foos 和 otherFoos。 【参考方案1】:

通常,为了执行 HQL 查询并在同一结果上返回多个实体的属性,您需要投影到 DTO。

因此,您将创建一个 DTO,例如 ObjectAB,它不会被映射,它可能会同时扩展对象 A 和 B,然后您将创建查询并将结果转换器设置为此 DTO。

或者,您可以使用元组而不是 DTO,但这不会改变主要思想。有关此方法的更多详细信息,您可以阅读this article。

【讨论】:

谢谢克里斯托斯!这正是我正在寻找的这种解决方案。

以上是关于HQL Fetch Join 不知道对象实现的主要内容,如果未能解决你的问题,请参考以下文章

即使在 HQL 查询中使用 Join Fetch,休眠延迟初始化异常

Hibernate(十三)迫切内连接fetch

Hibernate中left join fetch 查询出现重复的对象

HQL连接查询和注解

Hibernate中fetch和lazy介绍

Hibernate中fetch和lazy介绍