- 浏览: 7331143 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
-
本文讲述Hibernate查询语言HQL。Hibernate拥有一种功能非常强大的查询语言,这种语言被有意得与SQL非常相似,便于开发人员掌握。但不要被HQL的语法表面所迷惑,HQL完全是面向对象的,可以用来过程多态、继承、关联等关系。
Hibernate拥有一种功能非常强大的查询语言,这种语言被有意得与SQL非常相似,便于开发人员掌握。但不要被HQL的语法表面所迷惑,HQL完全是面向对象的,可以用来过程多态、继承、关联等关系。
1大小写敏感(Case Sensitivity)
HQL中的使用的Java的类名和属性名是大小写敏感的,其他的关键字都是大小写不敏感的。所以“SeLeCT”等同与“sELEct”,也等同于“SELECT”,因为它不是Java类名,也不是Java类的属性名。但Java类net.sf.hibernate.eg.FOO不等同于net.sf.hibernate.eg.Foo,同样foo.barSet也不等同于foo.BARSET。
在本手册中,HQL中的关键字均采用小写,一些用户可能发现HQL的关键字采用大写更易读,但我们也发现,当把这些HQL嵌入Java代码中,看起来很丑陋。
2from从句(The from clause)
Hibernate中最简单的from查询可能是:
- from eg.Cat
只是简单的返回eg.Cat类的所有实例。
在很多时候你可能需要为类设置别名(alias),因为你可能需要在查询的其他部分引用Cat。
- from eg.Cat as cat
关键字as是可选的,我们也可以写成:
- from eg.Cat cat
可以出现多个类,然后返回一个“笛卡儿积”或交叉连接:
- from Formula as form, Parameter as param
HQL中的别名用小写字母是一个好习惯,符合Java本地变量的命名规范。
3关联和连接(Associations and joins)
我们使用别名关联实体、甚至用join来关联值的集合的元素。
- from eg.Cat as cat
- inner join cat.mate as mate
- left outer join cat.kittens as kitten
- from eg.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 eg.Cat as cat
- join cat.mate as mate
- left join cat.kittens as kitten
另外,一个“fetch”连接允许使用单连接来关联或值的集合,使它们可以和父对象一起来初始化。这在使用Collection的情况下特别有用。
- from eg.Cat as cat
- inner join fetch cat.mate
- left join fetch cat.kittens
fetch join通常不需要设置别名,因为被关联的对象不应该被用在where从句中,也不能用在其他的任何从句中。
被关联的对象不能直接在查询结果中返回,他们可以通过父对象来访问。
请注意:在目前的实现中,在查询中只能返回一个集合。另外还要注意,fetch可能不用在被scroll()和iterator()调用的查询中。最后还要注意,full join fetch和right join fetch是没有意义的。
4 select从句(The select clause)
select从句用来挑选在结果集中返回的对象和属性:
- select cat.mate from eg.Cat cat
上面这个查询返回所有猫的配偶。
你也可以使用elements函数返回集合的元素。下面的查询将返回任何猫(Cat)的所有小猫(Kitten)。
- select elements(cat.kittens) from eg.Cat cat
查询也可以返回任何值类型(包括Component类型的属性)的属性:
- select cat.name from eg.DomesticCat cat
- where cat.name like 'fri%'
- select cust.name.firstName from Customer as cust
查询可以返回多个对象,也可以返回作为Object[]类型的数组的属性。
- select mother, offspr, mate.name
- from eg.DomesticCat as mother
- inner join mother.mate as mate
- left outer join mother.kittens as offspr
或者作为一个实际的Java对象:
- select new Family(mother, mate, offspr)
- from eg.DomesticCat as mother
- join mother.mate as mate
- left join mother.kittens as offspr
上面的这个查询语句假设Family类有适当的构造函数。
5 聚集函数(Aggregate functions)
查询可以使用属性的聚集函数:
- select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat) from eg.Cat cat
select从句的聚集函数中可以出现集合:
select cat, count( elements(cat.kittens) ) from eg.Cat cat group by cat
支持的聚集函数有:
· avg(...), sum(...), min(...), max(...)
· count(*)
· count(...), count(distinct ...), count(all...)
distinct 和all关键字的意义与用法和SQL中相同:
- select distinct cat.name from eg.Cat cat
- select count(distinct cat.name), count(cat) from eg.Cat cat
6 多态(polymorphism)
一个查询:from eg.Cat as cat,它返回的不只是Cat,也有DomesticCat(家猫)这样的子类。Hibernate可以在from从句中指定任何Java类和接口,查询将返回继承自该类和实现了该接口的所有的持久类的实例。下面的查询将返回所有持久的对象:
- from java.lang.Object o
指定的接口可以被多个不同的持久类实现:
- from eg.Named n, eg.Named m where n.name = m.name
注意最后2个查询将需要超过1个SQL的select,这意味着不能够按照从句指定的排列次序排列整个结果集。这也意味着你不能用Query.scroll()来调用这些查询。
7 where从句(The where clause)
where从句是你可以按照自己指定的条件更精确的返回实例:
- from eg.Cat as cat where cat.name='Fritz'
复合表达式使where从句功能非常强大:
- from eg.Cat as cat where cat.name='Fritz'
这个查询将被翻译成带有一个连接的SQL查询语句。
如果你写下这句查询:
- from eg.Foo foo where foo.bar.baz.customer.address.city is not null
这个查询翻译成SQL语句需要4个表连接。
“=”操作符不仅可以比较属性,也可以比较实例:
- from eg.Cat cat, eg.Cat rival where cat.mate = rival.mate
- select cat, mate from eg.Cat cat, eg.Cat mate where cat.mate = mate
一个叫id的特殊的属性被用来引用一个对象的唯一标识符,你也可以用对象的属性名。
- from eg.Cat as cat where cat.id = 123
- from eg.Cat as cat where cat.mate.id = 69
这个查询要比上一个有效率,因为不需要表连接。
可以使用复合主键的属性。假设person有一个由medicareNumber和country构成的符合主键:
- from bank.Person person
- where person.id.country = 'AU'
- and person.id.medicareNumber = 123456
- from bank.Account account
- where account.owner.id.country = 'AU'
- and account.owner.id.medicareNumber = 123456
再重复一次,第二个查询效率高些。
同样,一个指定了属性的类在多态持久(polymorphic persistence)的情况下访问实体的discriminator value。
一个被嵌入到where从句中的Java类名将被翻译成它的discriminator value。
from eg.Cat cat where cat.class = eg.DomesticCat
你也可以指定组件(component)的属性和用户自己定义的合成类型(及组件的组件等等)。
永远也不要使用一个以组件的属性结尾的路径表达式。举个例子,假设store.owner是一个带有一个叫address组件的实体:
- store.owner.address.city //正确
- store.owner.address //错误!
一个叫“any”的类型有2个特别的属性,一个是id,另一个是class,它允许我们用下面的办法进行连接(join)。AuditLog.item是一个用< any>映射的属性:
- from eg.AuditLog log, eg.Payment payment
- where log.item.class = 'eg.Payment' and log.item.id = payment.id
需要注意的是:查询中的log.item.class和payment.class将参考完全不同的数据库列。
8 表达式(Expressions)
where从句中的表达式允许你使用SQL中的很多东西:
· 数学运算符: +, -, *, /
· 二元比较运算符: =, >=, < =, < >, !=, like
· 逻辑操作符: and, or, not
· 字符串连接符: ||
· SQL函数,如: upper() and lower()
· 圆括号: ( )
· in, between, is null
· JDBC输入参数: ?
· 指定的参数::name, :start_date, :x1
· in和between:
- from eg.DomesticCat cat where cat.name between 'A' and 'B'
- from eg.DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )
和否定形式的(negated forms):
- from eg.DomesticCat cat where cat.name not between 'A' and 'B'
- from eg.DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )
· is null和is not null
· 也可以使用特殊的属性size或size()函数来测试集合的大小:
- from eg.Cat cat where cat.kittens.size > 0
- from eg.Cat cat where size(cat.kittens) > 0
· 对于有索引的集合,你可以使用特殊属性minIndex和maxIndex来引用最小索引和最大索引。同样,你也可以使用minElement和maxElement来引用基本类型的集合的minimum和maximum元素。
- from Calendar cal where cal.holidays.maxElement > current date
也可以是函数的形式:
- from Order order where maxindex(order.items) > 100
- from Order order where minelement(order.items) > 10000
在传递索引和元素给集合时(elements and indices函数)和传递子查询的结果集时,SQL函数any, some, all, exists, in都是被支持的:
- select mother from eg.Cat as mother, eg.Cat as kit
- where kit in elements(foo.kittens)
- select p from eg.NameList list, eg.Person p
- where p.name = some elements(list.names)
- from eg.Cat cat where exists elements(cat.kittens)
- from eg.Player p where 3 > all elements(p.scores)
- from eg.Show show where 'fizard' in indices(show.acts)
请注意:size, elements, indices, minIndex, maxIndex, minElement, maxElement在使用时有一些限制:
v where从句中的in只用于数据库的子查询。
v select从句中的in只用于elements 和indices函数。
v 带有索引的元素的collection(arrays, lists, maps)只能在where从句中通过索引引用:
- from Order order where order.items[0].id = 1234
- select person from Person person, Calendar calendar
- where calendar.holidays['national day'] = person.birthDay
- and person.nationality.calendar = calendar
- select item from Item item, Order order
- where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11
- select item from Item item, Order order
- where order.items[ maxindex(order.items) ] = item and order.id = 11
表达式中的[]的内部可以是一个算术表达式:
- select item from Item item, Order order
- where order.items[ size(order.items) - 1 ] = item
HQL为one-to-many关联和值的集合提供了内置的index()函数:
- select item, index(item) from Order order
- join order.items item
- where index(item) < 5
被一些特定数据库支持的SQL函数可以被使用:
- from eg.DomesticCat cat where upper(cat.name) like 'FRI%'
如果你还不相信上面的一切,那么想想更长的和更短的可读的查询吧:
- select cust
- from Product prod,
- Store store
- inner join store.customers cust
- where prod.name = 'widget'
- and store.location.name in ( 'Melbourne', 'Sydney' )
- and prod = all elements(cust.currentOrder.lineItems)
提示:something like
- SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order
- FROM customers cust,
- stores store,
- locations loc,
- store_customers sc,
- product prod
- WHERE prod.name = 'widget'
- AND store.loc_id = loc.id
- AND loc.name IN ( 'Melbourne', 'Sydney' )
- AND sc.store_id = store.id
- AND sc.cust_id = cust.id
- AND prod.id = ALL(
- SELECT item.prod_id
- FROM line_items item, orders o
- WHERE item.order_id = o.id
- AND cust.current_order = o.id)
发表评论
-
【转】在项目中使用多个数据源-多sessionFactory方案
2013-05-10 16:30 3126适用范围:适合SSH架构访问多个数据库, ... -
Hibernate使用中从数据库到模型的加载方式研究
2010-01-28 13:19 1963在项目中数据库中账单Bill一个字段是有多个订单id的以逗 ... -
hibernate中@Transient的使用
2010-01-19 15:20 10691项目中可能有许多实体的需要辅助的属性和方法辅助,hibe ... -
关于hibernate中注解和hbm共存时的加载规律
2010-01-19 15:13 3799项目中使用Spring2.5+hibern ... -
hibernate查询的使用的点滴积累
2010-01-09 13:04 1912/** * 前台查询酒店的级别,设备,类型 * * ... -
Hibernate 的HQL中一个经典函数elements的使用
2010-01-09 12:53 10342在传递索引和元素给集合时(elements and indic ... -
Hibernate关联查询中with的经典使用
2010-01-09 12:42 2213在项目采用Hibernate关联,采用关联使用比较简单,在关 ... -
判断数据库表每条记录中时间段是否在每一个时间段中
2010-01-09 12:35 3087项目中一个成品价格表,每条记录中的价格有一个使用时间 ... -
JPA 中注解一个父类中多个子类实现查询部分子类方法解决方法
2010-01-09 12:10 2070父类: @Entity@Inheritance(stra ... -
Hibernate调用执行存储过程
2010-01-09 12:03 2030项目中需要采用存 ... -
Hibernate的一个异常的解决方案
2009-12-05 11:01 2442在项目中使用HQL时的遇有多个类的嵌套比较发生的异常: ... -
Hibernate的事件和拦截器体系
2009-12-01 13:53 2358持久层框架底层的拦截器机制是对诸如Spring等业务管理容器拦 ... -
Hibernate的拦截器和监听器
2009-12-01 13:52 1975最近项目需要,用到了Hibernate的拦截器和监听器,有些小 ... -
Hibernate的拦截器和监听器
2009-12-01 13:50 3799项目采用Spring构建,持久层技术采用的是 JPA规范 + ... -
Hibernate的注解many-to-one
2009-11-28 12:12 23275項目中一個實例: ... -
条件查询(Criteria Queries
2009-11-18 13:14 1772... -
Hibernate查询语言(Query Language), 即HQL
2009-11-18 13:05 2476Hibernate查询语言(Query L ... -
Hibernate中的配置属性
2009-11-15 17:40 1757hbm2ddl.auto的使用配置说明: <!-- ... -
Hibernate JPA 的索引的使用
2009-11-15 17:30 11882在Hibernate中Model中一个对象关 ... -
Hibernate缓存性能监听
2009-11-15 17:23 1693Statistics接口提供三种类别的统计信息: ...
相关推荐
#### 四、HQL查询语言 - HQL(Hibernate Query Language)子句本身大小写无关,但在其中出现的类名和属性名需要注意大小写区分。 #### 五、对象关系映射(ORM) - **关系配置**: - **Constrained**:表示主控表...
1. HQL(Hibernate Query Language):面向对象的查询语言,类似SQL但针对对象模型。 2. Criteria 查询:提供API进行动态查询,无需编写字符串查询语句。 八、一对多、多对一、多对多关系映射 这些关系映射在实体类...
- **HQL**:Hibernate查询语言,是一种面向对象的查询语言,类似于SQL但更加面向对象。 - **特点**: - 支持对象导航查询。 - 可以查询单个对象或集合。 - 支持聚合函数、分组、排序等功能。 #### 十、性能优化 ...
#### 十六、HQL:Hibernate 查询语言 - **大小写敏感性**:解释 HQL 是否区分大小写。 - **from 子句**:介绍如何使用 from 子句指定查询的起点。 - **关联与连接**:展示如何在 HQL 中引用实体间的关联。 - **聚合...
- **Hibernate查询语言(HQL)**:介绍了HQL的基本语法,包括如何构造查询语句以及执行查询操作。 #### 五、Hibernate高级特性 - **XDoclet与Hibernate映射**:XDoclet是一种用于生成源代码或XML配置文件的工具,...
- **查询语言**:提供了 HQL (Hibernate Query Language) 和 Criteria API 等多种查询方式,支持复杂的查询需求。 - **缓存机制**:包括一级缓存和二级缓存,有效提升应用性能。 #### 三、安装与配置 ##### 1. ...
- **HQL**:一种面向对象的查询语言,类似于SQL,但更接近于面向对象编程的语言风格。 - **数据关联**:涉及到一对一双向或多向关联的实现方式,如一对一关联、一对多关联和多对多关联。 - **一对一关联**:可以...
- **HQL(Hibernate Query Language)**:类似于 SQL 的查询语言,但面向对象而非表格,支持更丰富的查询语法。 - **Criteria API**:提供了一种面向对象的查询方式,允许开发者构建复杂的查询条件。 - **Native SQL...
面向对象语言的发展简史 26 内容总结 29 独立实践 30 第三章:面向对象的程序设计 31 学习目标 31 类和对象的描述 32 声明类 32 声明属性 33 声明成员方法 34 源文件的布局 36 包的声明 36 包与目录的布局 38 内容...