[sql]
From Person as p join fetch p.myEvent
一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时,相关联的对象并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。
使用fetch关键字时需要注意以下几个问题:
1、fetch不应该与setMaxResults()和setFirstResults()共用,
2、fetch不能与独立的with条件一起使用
3、如果在一次查询中fetch多个集合,可以查询返回的笛卡尔积
4、full join fetch和right join fetch没有任何意义
5、对于bag映射而言,同时join fetch多个结合时可能会出现非预期结果
四、select子句
Select子句用于选择将哪些对象与属性返回到查询结果集中。当然select选择的属性必须是from后持久化类包含的属性。
[sql]
Select p.name from Person as p
select查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(Component)的属性:
[sql]
Select p.myEvent.title from Person as p
select查询语句可以返回多个对象和(或)属性,存放在 Object[]队列中:
[sql]
Select p,e from Person as p inner join p.myEvent as e with p.id=e.id
Select查询语句也支持将选择出的属性存放到一个List对象中
[sql]
Select new List(p.name,p.age) from Person as p
Select查询语句还可以将选择出的属性直接封装成一个对象。
[sql]
Select new ClassTest(p.id,p.name,p.age) from Person as p
但前提是ClassTest支持p.id,p.name,p.age的构造前,假如p.id的数据类型是int,p.name的数据类型是String,p.age的数据类型是int,那么ClassTest必须有如下构造器:
[java]
ClassTest(int id,String name,int age)
Select还支持给选定的表达式名别名:
[html]
Select p.name as personname from Person as p
种做法在与子句select new map一起使用时最有用:
[sql]
Select new map(p.name as personname) from Person as p
五、聚集函数
受支持的聚集函数如下:
avg(...), sum(...), min(...), max(...)
count(*)
count(...), count(distinct ...), count(all...)
Select子句也支持使用distinct和all关键字,此时的效果与SQL中的效果相同。
六、多态查询
Hibernate可以理解多态查询,from后跟持久化类名,不仅会查出该持久化类的全部实例还好查询出该类的全部子类的全部实例。
from Person as p
该查询语句不仅会查询出Person的全部实例,还会查询出Person的子类:Teacher的全部属性。
Hibernate 可以在from子句中指定任何 Java 类或接口. 查询会返回继承了该类的所有持久化子类 的实例或返回声明了该接口的所有持久化类的实例。下面的查询语句返回所有的被持久化的对象:
[html]
From java.lang.Object o
七、Where子句
where子句允许你将返回的实例列表的范围缩小. 如果没有指定别名,你可以使用属性名来直接引用属性:
[html]
From Person where age < 40
如果指派了别名,需要使用完整的属性名:
[sql]
From Person as p where p.age<40
复合属性表达式增强了where子句的功能:
[html]
From person p where p.myEvent.title like "%你是"
该查询语句被翻译为一个含有内连接的SQL查询语句。
只要没有出现集合属性,HQL语句可使用点号来隐式连接多个数据表:
[html]
From person p where p.myEvent.event.name like "%hhh";
上的语句SQL需要连接三张表。
=运算符不仅可以被用来比较属性的值,也可以用来比较实例:
[html]
from Cat cat, Cat rival where cat.mate = rival.mate
[sql] view plaincopyprint
from Cat cat, Cat rival where cat.mate = rival.mate
特殊属性(小写)id可以用来表示一个对象的唯一的标识符
[html]
From Person p where p.id=1
From Person p where p.myEvent.id=1
第二个查询是有效的。此时不需要进行表连接,而完全使用面向对象的方式查询!
在进行多态持久化的情况下,class关键字用来存取一个实例的鉴别之。嵌入where自己中的java类名将会被作为该类的鉴别值。
[sql]
from Person as p where p.class = Teacher
在执行多态的时候,默认会选出Person及其所有子类的实例,但是上面的HQL语句,将只会选出Teacher类的实例。
当where子句的运算符只支持基本类型或者字符串时,where子句中的属性表达式必须以基本类型或者字符串结尾,不要使用组件类型属性结尾。
八、order by 子句
查询返回的列表(list)可以按照一个返回的类或组件(components)中的任何属性(property)进行排序:
[sql]
From Person as p ordery by p.id
可选的asc或desc关键字指明了按照升序或降序进行排序.
九、group by子句
一个返回聚集值(aggrega