- 浏览: 1052007 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
wenson:
lzjzy520 写道 求 项目完整元代码已经够清楚了,看不懂 ...
使用Spring JavaMail发送邮件总结 -
lzjzy520:
求 项目完整元代码
使用Spring JavaMail发送邮件总结 -
xiejx618:
能提高多大的性能? 不能用数据来说话吧希望你能用jmeter做 ...
利用APR本地库提高Tomcat性能 -
mrwalter:
学习了,挺好用的,局域网内速度很快
ssh远程文件传输命令scp -
wcily123:
不错
ssh远程文件传输命令scp
传统的SQL语言采用的是结构化的查询方法,而这种方法对于查询以对象形式存在的数据却无能为力。幸运的是,Hibernate为我们提供了一种语法类似于SQL的语言,Hibernate查询语言(HQL),和SQL不同的是,HQL是一种面向对象的查询语言,它可以查询以对象形式存在的数据。因此,本文就HQL如何工作以及如何使用HQL展开了深入的讨论。
SQL本身是非常强大的。当SQL的这种强大和处理面向对象数据的能力相结合时,就产生了HQL。和SQL一样,HQL提供了丰富的查询功能,如投影查询、聚合函数、分组和约束。任何复杂的SQL都可以映射成HQL。 本文的第一部分将讨论HQL的简单用法。第二部分将讨论在HQL中如何根据上下文关系进行查询。在第三部分将以一个例子来说明如何在实际应用中使用HQL。 进入HQL世界 一个ORM框架是建立在面向对象的基础上的。最好的例子是Hibernate如何提供类SQL查询。虽然HQL的语法类似于SQL,但实际上它的查询目标是对象。HQL拥有面向对象语言的所有的特性,这其中包括多态、继承和组合。这就相当于一个面向对象的SQL,为了提供更强大的功能,HQL还提供了很多的查询函数。这些函数可以被分为四类: 1. 投影函数 2. 约束函数 3. 聚合函数 4. 分组函数 使用HQL可以建立简单的查询,也可以建立更复杂的查询。在本文中并不讨论那些非常复杂的查询,如含有子查询和很多连接的查询。本文只讨论连接两个表的查询。现在让我们开始接近HQL吧! 投影 如谓投影,就是一个可以访问的对象或对象的属性。在HQL中,可以使用from和select子句来完成这个工作。 from子句返回指定的类的所有实例。如from Order将返回Order类的所有实例。换句话说,以上的查询相当于以下的SQL语句:
from 是最简单的查询子句。from后面可以跟一个或多个类名(类名也可以带有别名)。为了得到Order和Product的所有实例,可以使用如下的查询:
和类名一样,别名也可以在from后使用,如下代码如示:
当查询很复杂时,加入别名可以减少语句的长度。我们可以看看如下的SQL语句:
我们可以很容易看出,上面的查询是一对多的关系。在HQL中相当于一个类中包含多个其它类的实例。因此,以上的SQL写成HQL就是:
现在让我们考虑另外一个从表中得到指定属性的情况。这就是最常用的select子句。这在HQL中的工作方式和SQL中一样。而在HQL中,如果只是想得到类的属性的话,select语句是最后的选择。以上的SQL可以使用select子句改成如下的HQL语句:
以上的HQL语句将返回Order中的所有Products实例。如果要得到对象的某一个属性,可以将HQL语句写成如下的形式:
如果要得到多个对象的属性,可以将HQL语句写成如下形式:
约束
这条查询语句返回了id等于1234的所有的字段。和这条SQL对等的是下面的HQL语句:
从以上两条语句可以看出,它们的where子句非常相似。而它们唯一的不同是SQL操作的是记录,而HQL操作的是对象。在HQL中,除了where子句可以过滤数据外,having子句也可以做到这一点(关于having子句的详细内容我将在分组部分讨论)。投影和约束是两个基本的操作,这两个操作再加上聚合函数的话,那HQL将变得更加强大。下面我们就来讨论什么是聚合。 聚合 上述的查询都是将每一个记录(对象)当做一个单位,而如果使用聚合,可以将一类记录(对象)当做一个单位。然后再对每一类的记录(对象)进行一系列地操作,如对某一列取平均值、求和、统计行数等等。HQL支持以下的聚合函数: 1. avg(…), sum(…) 2. min(…), max(…) 3. count(*), count(…), count(distinct…), count(all…) 以上的聚合函数都返回数值类型。这些操作都可以在select子句中使用,如下所示:
以上的HQL语句返回了两个值的和:orders表中的priceTotal的最大值和products表中的price的最大值之和。我们还可以使用having子句对分组进行过滤。如我们想按id统计priceTotal小于1000的数量可按如下的HQL语句去实现:
我们还可以将聚合函数和having子句一起使用。如我们要按products表的id统计price小于amount的平均数的产品数量,HQL语句如下:
从上面的一系列的HQL语句可以看出,所有通过SQL实现的,都可以通过HQL来实现。 分组 在上一部分,已经涉及到了分组的概念。分组操作的是行的集合。它根据某一列(属性)对记录集进行分组。这一切是通过group子句实现的。如下的例子描述了group子句的一般用法。
HQL中的分组和SQL中的分组类似。总之,除了一些对SQL的特殊扩展外,其它所有的SQL功能都可以使用HQL描述。在接下来的部分,让我们举例说明如何在java中使用HQL。 在java中使用HQL 到现在为止,我们已经学习了HQL的基本用法。接下来我们举一个例子来说明如何在Java中使用HQL。下面的例子只给出了主要的部分,由于本文只是讨论HQL的用法,因此,关于Hibernate的一些设置和在main()函数中调用Hibernate的部分并未给出,读者可以参考相关的文当。现在让我们看看下面的例子。 下面是必须引用的包
下面是类的声明
下面让我们来实现MyOrder类的构造函数
下面的getOrder函数根据priceTotal的区间值返回Order对象。
下面的main函数将测试MyOrder类
小结 上述的代码演示了如何在Java中使用HQL,但HQL还有两点需要注意一下: 1. HQL并不区分字母的大小写,但在HQL中的Java类和属性名必须和实际的类和属性名一致。如SELECT和select之间可以互换,但Order和order却代表不同的含义。 2. 如果HQL中引用的类未被导入,在HQL中必须引用具体的包。如本例中,如果com.Order未被导入,在HQL中必须将Order写成com.Order。
|
|||||||||||||||||||
(转载文章请保留出处:北天JAVA技术网(www.java114.com)) |
评论
3 楼
lysamer
2006-12-08
查询可以用元素类型是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有一个合适的构造函数。
hibernate官方网站就有例子啊
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有一个合适的构造函数。
hibernate官方网站就有例子啊
2 楼
liyong
2006-12-06
象一对多关联,我只象要多的中的部分,比如分页.
帖子和回复,查这个帖子和这个帖子的第10到第20的回复应该怎么写?
帖子和回复,查这个帖子和这个帖子的第10到第20的回复应该怎么写?
1 楼
liyong
2006-12-06
这样的HQL应该怎么写?
如果domain有N个属性,我只需要其中的部分属性,但返回的对象希望是domain而不是Object[],这查询该怎么写。
如果domain有N个属性,我只需要其中的部分属性,但返回的对象希望是domain而不是Object[],这查询该怎么写。
发表评论
-
Hibernate配置文件中映射元素详解
2006-12-05 13:40 6238配置文件中映射元素详解 对象关系的映射是用一个XML ... -
MyEclipse+struts+Hibernate配置开发
2006-11-11 23:55 3577说明: 这个手册只是为初学者制作的环境配置和快速开发的一些基 ... -
一个hibernate错误
2006-11-11 23:32 6427在设置成assigned时报:ids for this cla ... -
用hibernate常犯错误
2006-11-11 23:23 22231、hql 里用的是 类名 属性名 而不是数据库的表名字段名 ... -
如何用 Hibernate 实现分页查询
2006-11-10 11:30 1884例如: 从第2万条开始取出100条记录 ... -
Java开源项目Hibernate包作用详解
2006-11-10 11:28 1581Hibernate一共包括了23个jar包,令人眼花缭乱。 ... -
利用Eclipse开发Hibernate应用程序
2006-11-10 11:24 2904Eclipse是目前非常流行的开发平台,开放扩展的架构让很 ... -
如何在Eclipse中用Hibernate插件(组图)
2006-11-10 11:19 5610编辑映射文件 Hibernate Synchro ... -
Java学习之hibernate配置要点详谈
2006-11-10 11:09 20931.两种配置文件: A.hibernate.cfg.x ... -
在Struts和Hibernate之间搭起桥梁
2006-11-10 11:09 1531Hibernate和struts是当前市面上几个最流行的开 ... -
方便的HQL: Hibernate查询语言
2006-11-10 11:08 2272HQL: Hibernate查询语言 Hibernate配 ... -
Java基础知识:简单Hibernate入门
2006-11-10 11:06 1882Hibernate简介 Hibernate寓意: ... -
Java开源项目Hibernate快速入门
2006-11-10 11:05 1565其实Hibernate本身是个独立的框架,它不需要任何we ... -
从头到脚跟你解释什么是Hibernate
2006-11-10 11:04 2101Hibernate Hi ...
相关推荐
### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...
《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...
Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...
Hibernate HQL基础练习小列子+数据库
在“Hibernate HQL.zip_更新”这个压缩包中,我们可以找到关于使用Hibernate HQL进行插入、查询和更新操作的详细信息。 **1. Hibernate HQL 插入:** 在Hibernate中,插入数据通常通过Session对象的save()或...
对hibernate的hql进行了详尽的讲解
### Hibernate HQL 查询详解 #### 一、HQL(Hibernate Query Language)简介 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者使用类及其属性来编写查询语句,而不是传统的SQL语句。这使得...
本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...
根据提供的文件信息,我们可以深入探讨Hibernate HQL(Hibernate Query Language)的相关知识点,特别是关于其查询功能、连接操作、条件过滤以及聚合函数的应用等。 ### Hibernate HQL简介 Hibernate HQL是一种...
本程序“HibernateHql综合测试小程序”是针对Hibernate中的HQL(Hibernate Query Language)进行的一系列功能测试,涵盖了二十多种不同的HQL语句,旨在帮助开发者深入理解和熟练运用Hibernate的查询能力。...
Hibernate HQL 查询语句总结 Hibernate HQL 查询语句是 Hibernate 框架中的一种查询语言,它提供了更加丰富的和灵活的查询特性,具有类似标准 SQL 语句的查询方式,同时也提供了更加面向对象的封装。以下是 ...
**Hibernate HQL(Hibernate Query Language)** 是Hibernate提供的一个面向对象的查询语言,类似于SQL,但它是针对对象模型设计的。HQL允许开发者使用类和属性的名字而不是表和列名进行查询,从而降低了对底层...
### Hibernate HQL 基本查询详解 #### 一、HQL 概述 HQL (Hibernate Query Language) 是一种面向对象的查询语言,由 Hibernate 官方提供,用于简化数据库查询过程。与传统的 JDBC 方式相比,使用 HQL 进行数据库...
### Hibernate 课件_HQL 知识点解析 #### HQL查询 ...这些知识点涵盖了HQL的基本概念、查询方法、各种高级查询技巧以及Session的管理等方面,希望能够帮助大家更好地理解和掌握Hibernate的HQL查询技术。
以上内容涉及了使用 HQL 和 DetachedCriteria 进行查询、参数化查询、执行更新操作以及简单的统计查询等常见的 Hibernate 操作。这些知识点对于理解和掌握 Hibernate 框架的基本使用至关重要,同时也是开发基于 ...
Hibernate HQL,全称为Hibernate Query Language,是Hibernate框架中用于对象关系映射(ORM)的查询语言。HQL的设计目标是提供一种面向对象的查询方式,使得开发者能够以类和对象的角度来操作数据库,而不是直接使用...
### Hibernate HQL 查询详解 #### 一、HQL 概述 Hibernate 提供了一种非常强大的查询语言——HQL(Hibernate Query Language),它在语法上与 SQL 类似但功能更为强大,因为它支持面向对象的特性,例如继承、多态性...
这里使用了HQL(Hibernate Query Language)来执行查询。例如,在`getProductsMenuSub`方法中,通过以下HQL语句实现了连表查询: ```java String queryString = "select a.productsName from TopProducts as a, ...