hibernate hql 大全

Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

 

第 15 章 HQL: Hibernate查询语言
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

15.1. 大小写敏感性问题
除了Java类与属性的名称外,查询语句对大小写并不敏感。 所以 SeLeCT 与 sELEct 以及 SELECT 是相同的,但是 org.hibernate.eg.FOO 并不等价于 org.hibernate.eg.Foo 并且 foo.barSet 也不等价于 foo.BARSET。

本手册中的HQL关键字将使用小写字母. 很多用户发现使用完全大写的关键字会使查询语句 的可读性更强, 但我们发现,当把查询语句嵌入到Java语句中的时候使用大写关键字比较难看。

15.2. from子句
Hibernate中最简单的查询语句的形式如下:

from eg.Cat该子句简单的返回eg.Cat类的所有实例。 通常我们不需要使用类的全限定名, 因为 auto-import(自动引入) 是缺省的情况。 所以我们几乎只使用如下的简单写法:

from Cat大多数情况下, 你需要指定一个别名, 原因是你可能需要 在查询语句的其它部分引用到Cat

from Cat as cat这个语句把别名cat指定给类Cat 的实例, 这样我们就可以在随后的查询中使用此别名了。 关键字as 是可选的,我们也可以这样写:

from Cat cat子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接。

from Formula, Parameterfrom Formula as form, Parameter as param查询语句中别名的开头部分小写被认为是实践中的好习惯, 这样做与Java变量的命名标准保持了一致 (比如,domesticCat)。

15.3. 关联(Association)与连接(Join)
我们也可以为相关联的实体甚至是对一个集合中的全部元素指定一个别名, 这时要使用关键字join。

from Cat as cat
    inner join cat.mate as mate
    left outer join cat.kittens as kittenfrom Cat as cat left join cat.mate.kittens as kittensfrom 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 Cat as cat
    join cat.mate as mate
    left join cat.kittens as kitten还有,一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明(lazy declarations). 查看 第 20.1 节 “ 抓取策略(Fetching strategies) ” 以获得等多的信息。

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。

注意fetch构造变量在使用了scroll() 或 iterate()函数 的查询中是不能使用的。最后注意,使用full join fetch 与 right join fetch是没有意义的。

如果你使用属性级别的延迟获取(lazy fetching)(这是通过重新编写字节码实现的),可以使用 fetch all properties 来强制Hibernate立即取得那些原本需要延迟加载的属性(在第一个查询中)。

from Document fetch all properties order by namefrom Document doc fetch all properties where lower(doc.name) like '%cats%'15.4. select子句
select 子句选择将哪些对象与属性返 回到查询结果集中. 考虑如下情况:

select mate
from Cat as cat
    inner join cat.mate as mate该语句将选择mates of other Cats。(其他猫的配偶) 实际上, 你可以更简洁的用以下的查询语句表达相同的含义:

select cat.mate from Cat cat查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(Component)的属性:

select cat.name from DomesticCat cat
where cat.name like 'fri%'select cust.name.firstName from Customer as cust查询语句可以返回多个对象和(或)属性,存放在 Object[]队列中,

select mother, offspr, mate.name
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr或存放在一个List对象中,

select new list(mother, offspr, mate.name)
from DomesticCat as mother
    inner join mother.mate as mate
    left outer join mother.kittens as offspr也可能直接返回一个实际的类型安全的Java对象,

select new Family(mother, mate, offspr)
from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr假设类Family有一个合适的构造函数.

你可以使用关键字as给“被选择了的表达式”指派别名:

select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
from Cat cat这种做法在与子句select new map一起使用时最有用:

select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
from Cat cat该查询返回了一个Map的对象,内容是别名与被选择的值组成的名-值映射。

15.5. 聚集函数
HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果:

select avg(cat.weight), sum(c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值