我无法理解HQL连接

时间:2010-01-20 09:38:08

标签: hibernate hql

我开始使用hibernate。我对HQL联接感到很困惑......它们与mySQL联接真的不同......事实上,如果我有两个表,比如Parking和Auto,我会这样做:

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

或类似的东西。而在休眠中,我将有一个已经链接到Auto的Parking类,并且映射了所有关联。所以joind会通过hibernate自动解决。无论如何我仍然有join关键字但是在示例中它以我不理解的方式使用,通常在from子句中指定对象的属性...这意味着什么?那个操作的SQL等价是多少?

2 个答案:

答案 0 :(得分:2)

让我试试。这是我已经给出的一个例子(取自here

想象一下在线的情况 卖衬衫的商店。每件衬衫型号都有一定数量的可用尺码。您希望查询查找大小超过40的所有衬衫模型。在HQL中,查询可能如下:

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

换句话说,你想获得所有对象,但是你需要一些连接表的搜索条件(我的意思是加入一对多 - 你有一个availableSizes的集合和你没有连接,无法访问number属性。

修改
您可以从here获取更多信息。有关隐式显式连接的一些解释。更重要的是 - 一些提取策略(如果您将表之间的某些连接设置为 lazy ,但在某些情况下,您还希望立即获取它们)。阅读它,如果你没有,你会发现它很有用。

答案 1 :(得分:2)

重要的是要记住HQL讨论类和字段,而SQL则讨论表和列。

如果你指定了一个关联,hibernate会自动为你做连接。想象一个包含Book of List的类库。每本书都在一个图书馆里。

@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可以完成很多操作而不使用“join”!

有关http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

注释的更多详细信息