【问题标题】:Hibernate HQL: is JOIN really necessary?Hibernate HQL:JOIN 真的有必要吗?
【发布时间】: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 的特定情况?

【问题讨论】:

    标签: hibernate join


    【解决方案1】:

    在几种情况下显式指定连接很有用

    1. 您想指定与映射不同的连接类型,例如内部与外部。
    2. 您想要指定一个联接-获取方案,您不仅希望加入关联,而且还希望查询结果也能够获取关联。

    【讨论】:

    • 查询结果默认不获取关联?
    • 取决于相关的关联类型。如果您有@OneToMany,默认情况下该关联是LAZY,并且不会被获取;考虑一个带有许多Child 孩子的Parent。在这种情况下,如果您想在查询时获取父项及其子项,则必须明确要求持久性提供程序获取子集合关联,否则它将在您第一次访问集合时延迟加载。
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多