Hibernate配备了一种非常强大的Hibernate查询语言,这种语言看上去很像SQL。本文主要介绍大小写敏感性问题、from子句、关联(Association)与连接(Join)等。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。
成都创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为普兰店企业提供专业的成都做网站、网站制作,普兰店网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
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
大多数情况下, 你需要指定一个别名, 原因是你可能需要 在Hibernate查询语言的其它部分引用到Cat
- om Cat as cat
这个语句把别名cat指定给类Cat 的实例, 这样我们就可以在随后的查询中使用此别名了。 关键字as 是可选的,我们也可以这样写:
- from Cat cat
子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接。
- from Formula, Parameter
- from Formula as form, Parameter as param
查询语句中别名的开头部分小写被认为是实践中的好习惯, 这样做与Java变量的命名标准保持了一致 (比如,domesticCat)。
3. 关联(Association)与连接(Join)
Hibernate查询语言,我们也可以为相关联的实体甚至是对一个集合中的全部元素指定一个别名, 这时要使用关键字join。
- from Cat as cat
- inner join cat.mate as mate
- left outer join cat.kittens as kitten
- from Cat as cat left join cat.mate.kittens as kittens
- from 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). 查看 第 19.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 name
- from Document doc fetch all properties where lower(doc.name) like '%cats%'
【编辑推荐】
分享标题:简述Hibernate部分查询语言(一)
文章位置:http://www.shufengxianlan.com/qtweb/news41/153741.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联