8

我正在背负如何在单向多对一条件下加入表格?.

如果你有两个类:

class A {
    @Id
    public Long id;
}

class B {
    @Id
    public Long id;
    @ManyToOne
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    public A parent;
}

B -> A 是多对一的关系。我知道我可以向 A 添加一个 B 集合,但是我不想要这种关联。

所以我的实际问题是,是否有创建 SQL 查询的 HQL 或 Criteria 方式:

select * from A left join B on (b.parent_id = a.id)

这将检索所有引用 A 的 B 记录的笛卡尔积的所有 A 记录,并将包括没有 B 引用它们的 A 记录。

如果您使用:

from A a, B b where b.a = a

那么它是一个内部连接,您不会收到没有 B 引用它们的 A 记录。

如果没有两个查询,我还没有找到这样做的好方法,所以任何比这少的都很好。

谢谢。

4

2 回答 2

2

我已经用你发布的内容做了一个例子,我认为这可能有效:

select a,b from B as b left outer join b.parent as a在 HQL 中。

不过,我必须找到一种“标准”方式来做到这一点。

于 2010-03-05T18:54:37.830 回答
1

您可以通过指定 fetch 属性来做到这一点。

(10) fetch(可选)在外连接获取和顺序选择获取之间进行选择。

您可以在以下位置找到它:第 6 章。集合映射,向下滚动到:6.2。映射集合

编辑

我在您的问题评论中读到您想要一种执行原始 SQL 查询的方法?这里有一个可能感兴趣的参考:

第 13 章 - 原生 SQL 查询

如果你想通过 HQL 实现它:

第 11 章 HQL:Hibernate 查询语言

在第 11 章中,您想向下滚动到11.3。协会和加入

IQuery q = session.CreateQuery(@"from A as ClassA left join B as ClassB");

但是,我想 ClassB 需要成为 ClassA 的成员。进一步的解读会有所帮助。

可能证明对您有用的另一件事是命名查询

<query name="PeopleByName">
from Person p
where p.Name like :name
</query>

并从代码中调用此查询,如下所示:

using (var session = sessionFactory.OpenSession())
    using (var tx = session.BeginTransaction()) {
        session.GetNamedQuery("PeopleByName")
            .SetParameter("name", "ayende")
            .List();
        tx.Commit();
    }

请查看 Ayende 引用的链接,他对此进行了更深入的解释。

于 2010-03-05T17:27:06.283 回答