HQL Fetch Join 不知道对象实现

HQL Fetch Join without knowing object implementation

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

我的问题是: 我得到了一个映射对象 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 不知道 foosotherFoos AbstractObject。 在我看来,我不知道我会得到一个 ObjectA 还是 ObjectB

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

休眠版本:5.0.12.Final

一般来说,为了对同一结果执行 HQL 查询和 return 多个实体的属性,您需要投影到 DTO。

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

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