HQL Fetch Join 不知道对象实现
HQL Fetch Join without knowing object implementation
我遇到了性能问题,我正在尝试添加一些提取连接以仅在一个请求中获取一些数据。
我的问题是:
我得到了一个映射对象 AbstractObject
。
而且我还得到了其他映射对象,如 ObjectA
、ObjectB
等......所有这些都在扩展 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 不知道 foos
或 otherFoos
AbstractObject
。
在我看来,我不知道我会得到一个 ObjectA
还是 ObjectB
。
有人知道这个问题的解决方案吗?
休眠版本:5.0.12.Final
一般来说,为了对同一结果执行 HQL 查询和 return 多个实体的属性,您需要投影到 DTO。
所以您将创建一个 DTO,例如 ObjectAB,它不会被映射,它可能会同时扩展对象 A 和 B,然后您将创建查询并将结果转换器设置到该 DTO。
或者,您可以使用 Tuple 而不是 DTO,但这不会改变主要思想。有关此方法的更多详细信息,您可以阅读 this article.
我遇到了性能问题,我正在尝试添加一些提取连接以仅在一个请求中获取一些数据。
我的问题是:
我得到了一个映射对象 AbstractObject
。
而且我还得到了其他映射对象,如 ObjectA
、ObjectB
等......所有这些都在扩展 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 不知道 foos
或 otherFoos
AbstractObject
。
在我看来,我不知道我会得到一个 ObjectA
还是 ObjectB
。
有人知道这个问题的解决方案吗?
休眠版本:5.0.12.Final
一般来说,为了对同一结果执行 HQL 查询和 return 多个实体的属性,您需要投影到 DTO。
所以您将创建一个 DTO,例如 ObjectAB,它不会被映射,它可能会同时扩展对象 A 和 B,然后您将创建查询并将结果转换器设置到该 DTO。
或者,您可以使用 Tuple 而不是 DTO,但这不会改变主要思想。有关此方法的更多详细信息,您可以阅读 this article.