我开始使用hibernate。我对HQL
联接感到很困惑......它们与mySQL联接真的不同......事实上,如果我有两个表,比如Parking和Auto,我会这样做:
select *
from Parking
left join on Parking.pid = Auto.parkingId
或类似的东西。而在休眠中,我将有一个已经链接到Auto的Parking类,并且映射了所有关联。所以joind会通过hibernate自动解决。无论如何我仍然有join关键字但是在示例中它以我不理解的方式使用,通常在from子句中指定对象的属性...这意味着什么?那个操作的SQL等价是多少?
答案 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/
注释的更多详细信息