Hibernate装备了一种极为有力的查询语言,(有意地)看上去很像SQL。但是别被语法蒙蔽,HQL是完全面向对象的,具备继承、多态和关联等特性。
除了Java类和属性名称外,查询都是大小写不敏感的。 所以, SeLeCT 和 sELEct 以及 SELECT 相同的,但是 net.sf.hibernate.eg.FOO 和 net.sf.hibernate.eg.Foo 是不同的, foo.barSet 和 foo.BARSET也是不同的。
本手册使用小写的HQL关键词。有些用户认为在查询中使用大写的关键字更加易读,但是我们认为嵌入在Java代码中这样很难看。
可能最简单的Hibernate查询是这样的形式:
from eg.Cat
它简单的返回所有eg.Cat类的实例。
大部分情况下,你需要赋予它一个别名(alias),因为你在查询的其他地方也会引用这个Cat。
from eg.Cat as cat
上面的语句为Cat赋予了一个别名cat 。所以后面的查询可以用这个简单的别名了。as关键字是可以省略的,我们也可以写成这样:
from eg.Cat cat
可以出现多个类,结果是它们的笛卡尔积,或者称为“交叉”连接。
from Formula, Parameter
from Formula as form, Parameter as param
让查询中的别名服从首字母小写的规则,我们认为这是一个好习惯。这和Java对局部变量的命名规范是一致的。(比如,domesticCat).
你可以使用join定义两个实体的连接,同时指明别名。
from eg.Cat as cat inner join cat.mate as mate left outer join cat.kittens as kitten from eg.Cat as cat left join cat.mate.kittens as kittens from Formula form full join form.parameter param
支持的连接类型是从ANSI SQL借用的:
内连接,inner join
左外连接,left outer join
右外连接,right outer join
全连接,full join (不常使用)
inner join, left outer join 和 right outer join 都可以简写。
from eg.Cat as cat join cat.mate as mate left join cat.kittens as kitten
并且,加上 "fetch"后缀的抓取连接可以让联合的对象随着它们的父对象的初始化而初始化,只需要一个select语句。这在初始化一个集合的时候特别有用。
from eg.Cat as cat inner join fetch cat.mate left join fetch cat.kittens
抓取连接一般不需要赋予别名,因为被联合的对象应该不会在where子句(或者任何其它子句)中出现。并且,被联合的对象也不会在查询结果中直接出现。它们是通过父对象进行访问的。
请注意,目前的实现中,在一次查询中只会抓取一个集合(?原文为:only one collection role may be fetched in a query)。也请注意,在使用scroll()或者 iterate()方式调用的查询中,是禁止使用fetch构造的。最后,请注意full join fetch和right join fetch是没有意义的。