4.6.1 HQL 查询(2)
3. 聚集函数
HQL 也支持在选出的属性上使用聚集函数。HQL 支持的聚集函数与 SQL 完全相同,有如下 5 种。
avg: 计算属性平均值。
count: 统计选择对象的数量。
max:统计属性值的最大值。
min: 统计属性值的最小值。
sum: 计算属性值的总和。
例如:
select count(*) from Personselect max(p.age) from Person as p |
其中, select 子句还支持字符串连接符、算数运算符及 SQL 函数。例如:
select p.name // ".// p.address from Person as p |
此外, select 子句也支持使用 distinct 和 all 关键字,此时的效果与 SQL 中的效果完全相同。
4. 多态查询
HQL 语句被设计成能理解多态查询,其 from 后跟的持久化类名不仅会查询出该持久化类的全部实例,还会查询出该类中子类的全部实例。
如下面的查询语句:
from Person as p |
该查询语句不仅会查询出 Person 的全部实例,还会查询出 Person 的子类。如 Teacher的全部实例,前提是 Person 和 Teacher完成了正确继承映射。
HQL 支持在 from 子句中指定任何 Java类或接口,查询并返回继承了该类的持久化子类的实例或返回实现该接口的持久化类的实例。下面的查询语句将返回所有的被持久化的对象:
from java.lang.Object a |
from Named. as n |
注意:后面的两个查询将需要多个 SQLSELECT 语句,因此无法使用 orderby 子句对结果集排序,从而不九许对这些查询结果使用Que可.scro1l0方法。
5. where子句
where 子句用于筛选选中的结果,以缩小选择的范围。如果没有为持久化实例另起别名,可以直接使用属性名引用属性。
如下面的HQL语句:
from Person where name like"tom%" |
from Person as p where p.name like"tom%" |
在后面的HQL语句中,如果为持久化实例另起了别名,则应该使用完整的属性名。两个 HQL语句都可返回name属性以tom开头的实例。
复合属性表达式加强了where子句的功能,例如下面的HQL语句:
from Cat cat where cat.mate.name like"kit%" |
select* from cat_table as table1 cat_table as table2 |
from Foo foo where foo.bar.baz.customer.address.citylike"guangzhou%" |
翻译成SQL查询语句后,将变成一个四表连接的查询。
"-"运算符不仅可以被用来比较属性的值,也可以用来比较实例:
from Cat cat, Cat rival where cat.mate = rival.mate |
from Cat as cat where cat.id=123from Cat as cat where cat.mate.id = 69 |
第二个查询是一个内连接查询,但在HQL 查询语句下,无须体会多表连接,而完全使用面向对象的方式查询。
另外, id 也可代表引用标识符。如Person类有一个引用标识符,它由count可属性与 medicareNumber两个属性组成。下面的HQL语句有效:
from Person as personwhere person.id.country = |
第二个查询是一个多表连接查询,跨越两个表:Person 和 Account。但此处感受不到多表连接查询的效果。
在进行多态持久化的情况下,class关键字用来存取一个实例的鉴别值(discriminatorvalue)。嵌入 where 子句中的 Ja切类名将被作为该类的鉴别值。例如:
from Cat cat where cat.class = DomesticCat |
其中, where 子句中的属性表达式必须以基本类型或者java.lang.String 结尾,不要使用引用类型属性结尾。如Account有 Person属'性:而Person有 Name属'性; Name有firstName属性。
看下面的情形:
from Account as a where a.person.name.firstNamelike 吐捎回 //正确
from Account as a where a.person.name like "dd% " //错误