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 真的有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate HQL Join 与复合键

HQL Hibernate INNER JOIN

为啥得到 org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!加入 3 个表时

LEFT JOIN 中带有子句的 Hql 错误

HQL查询会使用Hibernate二级缓存吗

hibernate hql update操作