4.6.1 HQL 查询(4)
7. orderby 子句
查询返回的列表(list),可以根据类或引用属性的任何属性来进行排序,例如:from Person as porder by p.name, p.age还可使用ase 或 dese关键宇指定升序或降序的排序规则,例如:
from Person as porder by p.name asc, p.age desc |
如果没有指定排序规则时,默认采用升序规则。与是否使用asc 关键字没有区别,加 asc 是升序排序,不加asc 也是升序排序。
8. group by子句
利用返回聚集值的查询,可以对持久化类或引用属性的属性进行分组,分组时可使用 groupby 子句。看下面的HQL查询语句:
select cat.color, sum(cat.weight) , count(cat) |
类似于 SQL 的规则,出现在 select 后的属性要么出现在聚集函数中,要么出现在group by 的属性列表中。看下面示例:
//select 后出现的 id 处出现在 group by 之后,而 name 属性则出现在聚集函数中 |
having子句用于对分组进行过滤,例如:
select cat.color, sum(cat.weight) , count(cat)from Cat catgroup |
注意: having子句用于对分组进行过滤,因此having子句只能在有groupby 子句时才可以使用,没有groupby 子句,则不能使用having子句。
Hibernate可将 HQL语句直接翻译成数据库SQL语句。因此,如果底层的数据库支持在having和 groupby子句中出现的一般函数或聚集函数,则HQL的 having与 orderby子句中也可以出现一般函数和聚集函数。例如:
select catfrom Cat catjoin cat.kittens kittengroup by |
注意:group by 子句与 orderby 子句中都不能包含算术表达式。
9. 子查询
如果底层数据库支持子查询,则可以在HQL 语句中使用子查询。与 SQL 中子查询相似的是, HQL 中的子查询也需要使用 "0" 括起来。例如:
from Cat as fatcatwhere fatcat.weight > |
from Cat as catwhere not ( cat.name, cat.color )in( |
10. fetch 关键字
对于集合属性, Hibernate 默认采用延迟加载策略。例如,对于持久化类Person,有无法访问关联的 scores 属性。
为了解决该问题,可以在Hibetτlate 映射文件中取消延迟加载,或者使用 fetchjoin。例如:
from Person as p join p.scores |
上面的fetch语句将会初始化person 的 scores集合属性。
如果使用了属性级别的延迟加载,可以用fetchall properties 来强制 Hibernate 立即抓取那些原本需要延迟加载的属性。例如:
from Document fetch all properties order by namefrom Document |
11.命名查询
HQL 查询还支持将查询所用的HQL语句放入配置文件中,而不是代码中。通过这种方式,可以大大提高程序的解祸。
下面是使用que可元素定义命名查询的配置文件代码:
<!定义命名查询--> |