如何在Hibernate中以单向多对一方式离开连接表?

时间:2010-03-04 23:18:22

标签: java hibernate orm many-to-one

我正在躲开How to join tables in unidirectional many-to-one condition?

如果你有两个班级:

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记录。

如果没有两个查询,我还没有找到一个很好的方法,所以任何不到的东西都会很棒。

感谢。

2 个答案:

答案 0 :(得分:2)

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

HQL中的

select a,b from B as b left outer join b.parent as a

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

答案 1 :(得分:1)

您可以通过指定fetch属性来执行此操作。

  

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

您可以在Chapter 6. Collection Mapping找到它,向下滚动到: 6.2。映射集合

修改

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

Chapter 13 - Native SQL Queries

如果你想通过HQL实现这一目标:

Chapter 11. HQL: The Hibernate Query Language

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

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

但我想ClassB需要成为ClassA的成员。进一步的重新分配应有所帮助。

另一件可能对您有用的事情是named queries

<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的参考链接,他会更深入地解释它。