【问题标题】:How do I left join tables in unidirectional many-to-one in Hibernate?如何在 Hibernate 中将连接表保留为单向多对一?
【发布时间】:2010-03-04 23:18:22
【问题描述】:

我正在背靠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 记录。

如果没有两个查询,我还没有找到一个很好的方法,所以如果没有两个查询,那就太好了。

谢谢。

【问题讨论】:

  • @Joe B 而你想要的是...... ???
  • @Arthur Ronald F D Garcia:我需要一种标准或 HQL 方法来生成我上面写的原始 SQL 查询。我已经编辑了帖子以加粗实际问题。

标签: java hibernate orm many-to-one


【解决方案1】:

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

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

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

【讨论】:

  • 也许这样可以解决问题:从 B 中选择 a, b 作为 b 右加入 b.parent 作为 a
  • 我没有想到正确的加入。只要 HQL 支持右连接并且我只使用几个可能有效的表。我试试看。
【解决方案2】:

您可以通过指定 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 引用的链接,他对此进行了更深入的解释。

【讨论】:

  • 我不想在 A 中映射 B 的集合。我需要一个没有映射集合的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2011-04-24
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多