HQL Fetch Join 不知道对象实现
Posted
技术标签:
【中文标题】HQL Fetch Join 不知道对象实现【英文标题】:HQL Fetch Join without knowing object implementation 【发布时间】:2020-08-08 01:07:19 【问题描述】:我遇到了性能问题,我正在尝试添加一些 fetch join 以仅在一个请求中获取一些数据。
我的问题是:
我得到了一个映射对象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
【问题讨论】:
附加信息:我不想使用复活节解决方案总是得到 foos 和 otherFoos。 【参考方案1】:通常,为了执行 HQL 查询并在同一结果上返回多个实体的属性,您需要投影到 DTO。
因此,您将创建一个 DTO,例如 ObjectAB,它不会被映射,它可能会同时扩展对象 A 和 B,然后您将创建查询并将结果转换器设置为此 DTO。
或者,您可以使用元组而不是 DTO,但这不会改变主要思想。有关此方法的更多详细信息,您可以阅读this article。
【讨论】:
谢谢克里斯托斯!这正是我正在寻找的这种解决方案。以上是关于HQL Fetch Join 不知道对象实现的主要内容,如果未能解决你的问题,请参考以下文章
即使在 HQL 查询中使用 Join Fetch,休眠延迟初始化异常