2010-01-20 47 views
3

我開始使用hibernate。我很困惑HQL加入...他們,比如說,從MySQL的加入......事實上,如果我有兩個表像停車場和汽車,我會做真的不一樣:我無法理解HQL加入

select * 
from Parking 
left join on Parking.pid = Auto.parkingId 

或東西等。相反,在休眠狀態下,我將有一個Parking類已經鏈接到Auto,並且映射了所有關聯。所以joind會通過休眠自動解決。無論如何,我仍然有join關鍵字,但在示例中以我不明白的方式使用它,通常在from子句中指定對象的屬性...這意味着什麼?什麼是該操作的SQL equiv?

回答

2

重要的是要記住HQL會談論類和字段,而SQL會談論表和列。

如果你指定一個關聯,hibernate會自動爲你做連接。設想一個包含書籍列表的類庫。每本書都在一個圖書館裏。

@Entity public class Library { 
    @OneToMany(mappedBy"library") 
    public List<Book> getBooks() { 
    return books; 
    } 
    ... 
} 

@Entity public class Book { 
    @ManyToOne 
    public Library getLibrary() { 
    return library; 
    } 
    ... 
} 

然後,您可以使用hibernate爲您找到一個Library對象,而且您不需要指定任何連接。它只知道該怎麼做(儘管如果你給它更多的細節,你通常可以幫助它提高性能)。

Library library = entityManager.find(Library,1); 
for (Book book : library.getBooks()) { 
    System.out.println("Found book: " + book.toString()); 
} 

根據我的經驗,使用hibernate可以在不使用「連接」的情況下完成很多工作!在註釋

更多細節在http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

2

讓我試試。這是我已經給出的一個例子(取自here

想象一下在線 商店出售襯衫的情況。每個襯衫模型都有一定數量的可用尺寸。希望查詢到超過40 HQL找到所有尺寸的襯衫款式,查詢可能如下:

from Shirt shirt 
join shirt.availableSizes size 
where size.number > 40 

換句話說,你想獲得的所有對象,但你需要搜索條件對於一些連接表(我的意思是加入一對多 - 你有一個availableSizes的集合,並且不能在沒有連接的情況下達到number屬性)。

編輯
你可以從here一些更多的信息。有一些關於隱含的解釋顯式連接。更重要的是 - 一些提取策略(如果你在表格之間建立了一些連接,如懶惰,但是在某些情況下,您還希望立即獲取它們)。閱讀它,如果你沒有,你可能會覺得它很有用。

+0

這樣看來,經典* *加入我會做一個關係數據庫已經完成。 HQL中連接子句的唯一目的是選擇連接表的列並對其施加限制......是不是? – gotch4 2010-01-20 10:56:19

+0

@ gotch4 - 好吧,不僅如此。看到編輯,我參考的文章中有更多解釋。 – Danail 2010-01-20 11:59:14

+1

@Danail:是否可用尺寸是單個課程/表格還是襯衫領域? – arjacsoh 2013-09-04 12:40:06