2010-03-04 65 views
8

我背馱着How to join tables in unidirectional many-to-one condition?如何在Hibernate中單向多對一地離開連接表?

如果你有兩類:

class A { 
    @Id 
    public Long id; 
} 

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

乙 - >是多對一的關係。我明白,我可以添加B的集合,但我不想要那種關聯。

所以我實際的問題是,是否有創建SQL查詢的HQL或條件的方式:

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

這會檢索所有A記錄與引用了每個B記錄的笛卡爾積和將包括沒有B引用它們的A記錄。

如果你使用:

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

那麼它是內連接和您沒有收到沒有A B引用它們的A記錄。

我還沒有找到一個沒有兩個查詢這樣做的好方法,所以比這更少。

謝謝。

+0

@Joe B你想要的是...? – 2010-03-05 02:36:31

+0

@Arthur Ronald F D Garcia:我需要一個Criteria或HQL方法來製作上面我寫的原始SQL查詢。我已經編輯過這個帖子來大膽提出實際問題。 – jbarz 2010-03-05 17:20:08

回答

2

我已經和你貼什麼的例子,我想這可能工作:

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

我必須找到一個「標準」的方式來做到這一點。

+0

對不起,我誤讀了,這不是你所需要的 – Luciano 2010-03-05 18:59:49

+1

也許這一個會做伎倆: 選擇一個,B從B作爲B權利加入b.parent作爲 – Luciano 2010-03-05 19:27:55

+0

我沒有想到一個正確的加入。只要HQL支持正確的連接,並且我只使用幾個可能工作的表。我會試一試。 – jbarz 2010-03-05 21:44:20

1

您可以通過指定獲取屬性來實現。

(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更深入地解釋它。

+0

我不想在A中映射B的集合。我需要一個沒有映射集合的查詢。 – jbarz 2010-03-05 17:41:48

相關問題