Hibernate HQL:JOIN 真的有必要吗?
Posted
技术标签:
【中文标题】Hibernate HQL:JOIN 真的有必要吗?【英文标题】:Hibernate HQL: is JOIN really necessary? 【发布时间】:2017-05-16 23:17:33 【问题描述】:我正在学习 Hibernate,我想知道在 HQL 查询中使用 JOIN 子句有什么用。我可能错了,但在我看来,你总是可以不用。
假设我有一个 ChildClass 实体,它与 ParentClass 具有映射的 @ManyToOne 关系。
现在我可以像这样构建一个 HQL 查询:
session.createQuery("FROM ChildClass ch WHERE ch.parentClass.id=1L")
如您所见,我可以通过父类的 id 字段过滤结果,通过子类访问它:ch.parentClass.id
如果我想在 SQL 中做同样的事情,我需要执行 JOIN,查询如下:
SELECT * FROM ChildTable ch
JOIN ParentTable p ON (ch.parent_id = p.id)
WHERE p.id=1;
如果我明白这一点,在 HQL 中我不需要在我的查询中包含任何 JOIN,因为 @ManyToOne 映射关系隐式地连接了这两个实体。那么为什么我会在 HQL 查询中使用 JOIN 呢?是否存在需要 JOIN 的特定情况?
【问题讨论】:
【参考方案1】:在几种情况下显式指定连接很有用
-
您想指定与映射不同的连接类型,例如内部与外部。
您想要指定一个联接-获取方案,您不仅希望加入关联,而且还希望查询结果也能够获取关联。
【讨论】:
查询结果默认不获取关联? 取决于相关的关联类型。如果您有@OneToMany
,默认情况下该关联是LAZY
,并且不会被获取;考虑一个带有许多Child
孩子的Parent
。在这种情况下,如果您想在查询时获取父项及其子项,则必须明确要求持久性提供程序获取子集合关联,否则它将在您第一次访问集合时延迟加载。以上是关于Hibernate HQL:JOIN 真的有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章
为啥得到 org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!加入 3 个表时