HQL的使用-part2 hql的查询(2)

来源:互联网 发布:403 forbidden nginx 编辑:程序博客网 时间:2024/06/10 20:05
 

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
如果 Named 接口有多个持久化实现类,下面语句将返回这些持久化类的全部实例:
 from Named. as n

注意:后面的两个查询将需要多个 SQLSELECT 语句,因此无法使用 orderby 子句对结果集排序,从而不九许对这些查询结果使用Que可.scro1l0方法。

5. where子句

where 子句用于筛选选中的结果,以缩小选择的范围。如果没有为持久化实例另起别名,可以直接使用属性名引用属性。

如下面的HQL语句:

from Person where name like"tom%"
下面 HQL语句与上面的语句效果相同:
from Person as p where p.name like"tom%"

在后面的HQL语句中,如果为持久化实例另起了别名,则应该使用完整的属性名。两个 HQL语句都可返回name属性以tom开头的实例。

复合属性表达式加强了where子句的功能,例如下面的HQL语句:

from Cat cat where cat.mate.name like"kit%"
该查询将被翻译成为一个含有内连接的SQL查询,翻译后的SQL语句如下:
select* from cat_table as table1 cat_table as table2 
where table1.mate=table2.id and table1.name like"kit%"
再看下面的HQL查询语句:
from Foo foo where foo.bar.baz.customer.address.citylike"guangzhou%"

翻译成SQL查询语句后,将变成一个四表连接的查询。

"-"运算符不仅可以被用来比较属性的值,也可以用来比较实例:

from Cat cat, Cat rival where cat.mate = rival.mate
select cat, matefrom Cat cat, Cat matewhere cat.mate = mate
特殊属性(小写)id 可以用来表示一个对象的标识符(你也可以使用该对象的属性名)。
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 = 
'AU'and person.id.medicareNumber = 123456from
Account as accountwhereaccount.owner.id.country='AU'
and account.owner.id.medicareNumber = 123456

第二个查询是一个多表连接查询,跨越两个表: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% " //错误
原创粉丝点击