Hibernate 我能';我不理解HQL连接

Hibernate 我能';我不理解HQL连接,hibernate,hql,Hibernate,Hql,我开始使用hibernate。我对HQL连接非常困惑。。。他们真的不同于,比如说,mySQL连接。。。事实上,如果我有两张桌子,比如停车和自动,我会: select * from Parking left join on Parking.pid = Auto.parkingId 或者类似的东西。相反,在hibernate中,我将有一个已链接到Auto的Parking类,并映射所有关联。因此joint将由hibernate自动解析。无论如何,我仍然有join关键字,但在示例中,它的使用方式我不理

我开始使用hibernate。我对
HQL
连接非常困惑。。。他们真的不同于,比如说,mySQL连接。。。事实上,如果我有两张桌子,比如停车和自动,我会:

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

或者类似的东西。相反,在hibernate中,我将有一个已链接到Auto的Parking类,并映射所有关联。因此joint将由hibernate自动解析。无论如何,我仍然有join关键字,但在示例中,它的使用方式我不理解,通常在from子句中指定对象的属性。。。这意味着什么?该操作的SQL等效值是多少

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

想象一下一个在线的例子 卖衬衫的商店。每种衬衫型号都有一定数量的可用尺码。您需要查询以查找所有尺寸超过40的衬衫型号。在HQL中,查询可能如下所示:

from Shirt shirt
join shirt.availableSizes size
where size.number > 40
换句话说,您希望获取所有对象,但需要一些联接表的搜索条件(我的意思是联接一对多-您有一个可用的
集合
,没有联接就无法访问
number
属性)

编辑

你可以从中获得更多信息。关于隐式连接和显式连接有一些解释。更重要的是,一些抓取策略(如果您将表之间的一些连接设置为惰性,但在某些情况下,您还希望立即抓取它们)。如果没有读过,你可能会发现它很有用。

重要的是要记住,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完全不需要使用“加入”就可以完成很多工作


通过这种方式,关于注释的更多细节似乎已经完成了我将在关系数据库上进行的经典连接。HQL中join子句的唯一用途是选择联接表的一列并对其进行限制。。。是吗?@gotch4-嗯,不仅仅是这个。请参阅编辑,在我参考的文章中有更多的解释。@Danail:is availableSizes一个单独的类/表,还是仅仅是shirt中的一个字段?
Library library = entityManager.find(Library,1);
for (Book book : library.getBooks()) {
  System.out.println("Found book: " + book.toString());
}