没有合适的资源?快使用搜索试试~ 我知道了~
Hibernate查询语言(HQL) 语法参考
需积分: 50 12 下载量 12 浏览量
2011-05-13
16:55:33
上传
评论
收藏 24KB DOCX 举报
温馨提示
试读
11页
HQL中文语法参考, 详细描述hibernate 查询语言的各种语法,是不可多得的HQL中文参考资料!
资源推荐
资源详情
资源评论
HQL 语法参考
Hibernate 配备了一种非常强大的查询语言,这种语言看上去很像 SQL。但是不要被语法结构上
的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态
和关联之类的概念。
1.大小写敏感性问题
除了 Java 类与属性的名称外,查询语句对大小写并不敏感。 所以 SeLeCT 与 sELEct 以及
SELECT 是相同的,但是 org.hibernate.eg.FOO 并不等价于 org.hibernate.eg.Foo 并且
foo.barSet 也不等价于 foo.BARSET。
本手册中的 HQL 关键字将使用小写字母. 很多用户发现使用完全大写的关键字会使查询语句 的可
读性更强, 但我们发现,当把查询语句嵌入到 Java 语句中的时候使用大写关键字比较难看。
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)。
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). 以获得等多的信息。
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%'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.8rstName from Customer as cust 查询语句可以返回多个对象和(或)属性,存
放在 Object[]队列中,
select mother, o;spr, mate.name from DomesticCat as mother inner join
mother.mate as mate left outer join mother.kittens as o;spr 或存放在一个 List 对象中,
select new list(mother, o;spr, mate.name) from DomesticCat as mother inner join
mother.mate as mate left outer join mother.kittens as o;spr 也可能直接返回一个实际的
类型安全的 Java 对象,
select new Family(mother, mate, o;spr) from DomesticCat as mother join
mother.mate as mate left join mother.kittens as o;spr 假设类 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 的对象,内容是别名与被选择的值组成的名-值映射。
5.聚集函数
HQL 查询甚至可以返回作用于属性之上的聚集函数的计算结果:
select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat) from Cat cat 受
支持的聚集函数如下:
avg(...), sum(...), min(...), max(...)
count(*)
count(...), count(distinct ...), count(all...)
你可以在选择子句中使用数学操作符、连接以及经过验证的 SQL 函数:
select cat.weight + sum(kitten.weight) from Cat cat join cat.kittens kitten group by
cat.id, cat.weightselect 8rstName||' '||initial||' '||upper(lastName) from Person 关键字
distinct 与 all 也可以使用,它们具有与 SQL 相同的语义.
select distinct cat.name from Cat cat select count(distinct cat.name), count(cat)
from Cat cat6.多态查询
一个如下的查询语句:
from Cat as cat 不仅返回 Cat 类的实例, 也同时返回子类 DomesticCat 的实例. Hibernate 可
以在 from 子句中指定任何 Java 类或接口. 查询会返回继承了该类的所有持久化子类的实例或返
回声明了该接口的所有持久化类的实例。下面的查询语句返回所有的被持久化的对象:
from java.lang.Object o 接口 Named 可能被各种各样的持久化类声明:
from Named n, Named m where n.name = m.name 注意,最后的两个查询将需要超过一
个的 SQL SELECT.这表明 order by 子句 没有对整个结果集进行正确的排序. (这也说明你不能对
这样的查询使用 Query.scroll()方法.)
7.where 子句
剩余10页未读,继续阅读
资源评论
aleno2
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功