- 浏览: 707630 次
- 来自: ...
文章分类
最新评论
-
ranguisheng:
可以加点注释,代码不便于阅读.
用java实现数据库连接池的一个简单示例 -
abcd880129:
这样写的话,还要用专门的下载工具,不然,只能下到一个为空的ex ...
ZK下载文件时,不在服务器生成文件直接下载 -
234369425:
同上,是20
java计算阶乘 -
CodeToMyLaw:
如果目录中含有中文呢?
[^\x00-\xff] 中文的 ...
js验证文件目录格式的正确性 -
yanzhoupuzhang:
加了,还是报那个错误!
org.apache.commons.dbcp.BasicDataSource的解决方法
传统的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语句:
select * from order
from 是最简单的查询子句。from后面可以跟一个或多个类名(类名也可以带有别名)。为了得到
Order和Product的所有实例,可以使用如下的查询:
from Order, Product
和类名一样,别名也可以在from后使用,如下代码如示:
from Order as o, Product p
当查询很复杂时,加入别名可以减少语句的长度。我们可以看看如下的SQL语句:
select o.*, p.* from order o, product p where o.order_id = p.order_id
我们可以很容易看出,上面的查询是一对多的关系。在HQL中相当于一个类中包含多个其它类的实例
。因此,以上的SQL写成HQL就是:
from Order as o inner join o.products as product
现在让我们考虑另外一个从表中得到指定属性的情况。这就是最常用的select子句。这在HQL中的工
作方式和SQL中一样。而在HQL中,如果只是想得到类的属性的话,select语句是最后的选择。以上的SQL
可以使用select子句改成如下的HQL语句:
select product from Order as o inner join o.products as product
以上的HQL语句将返回Order中的所有Products实例。如果要得到对象的某一个属性,可以将HQL语句
写成如下的形式:
select product.name from Order as o inner join o.products as product
如果要得到多个对象的属性,可以将HQL语句写成如下形式:
select o.id, product.name from Order as o inner join o.products as product
接下来,我们将进入下一个议题。假设我们需要根据某些条件得到数据。那么以上所述的HQL语句将
无法满足需求。为了达到这一目的,我们就要用到下面将要讨论的约束子句。
约束
从以上可知,投影返回的是所有的数据。但在大多数时候我们并不需要这么多数据。这就需要对数据
进行过滤。在HQL中过滤数据的子句和SQL一样,也是where。它的语法类似于SQL,通过where子句,可以
对行进行过滤。我们可以看看下面的SQL语句:
select * from orders where id = ‘1234’
这条查询语句返回了id等于1234的所有的字段。和这条SQL对等的是下面的HQL语句:
select o from Order o where o.id=’1234’
从以上两条语句可以看出,它们的where子句非常相似。而它们唯一的不同是SQL操作的是记录,而
HQL操作的是对象。在HQL中,除了where子句可以过滤数据外,having子句也可以做到这一点(关于
having子句的详细内容我将在分组部分讨论)。投影和约束是两个基本的操作,这两个操作再加上聚合函
数的话,那HQL将变得更加强大。下面我们就来讨论什么是聚合。
聚合
上述的查询都是将每一个记录(对象)当做一个单位,而如果使用聚合,可以将一类记录(对象)当
做一个单位。然后再对每一类的记录(对象)进行一系列地操作,如对某一列取平均值、求和、统计行数
等等。HQL支持以下的聚合函数:
1. avg(…), sum(…)
2. min(…), max(…)
3. count(*), count(…), count(distinct…), count(all…)
以上的聚合函数都返回数值类型。这些操作都可以在select子句中使用,如下所示:
select max(o.priceTotal) + max(p.price) from Order o join o.products p group by o.id
以上的HQL语句返回了两个值的和:orders表中的priceTotal的最大值和products表中的price的最大
值之和。我们还可以使用having子句对分组进行过滤。如我们想按id统计priceTotal小于1000的数量可按
如下的HQL语句去实现:
select count(o) from Order o having o.priceTotal < 1000 group by o.id
我们还可以将聚合函数和having子句一起使用。如我们要按products表的id统计price小于amount的
平均数的产品数量,HQL语句如下:
select count(p) from Product p having p.price < avg(amount) group by p.id
从上面的一系列的HQL语句可以看出,所有通过SQL实现的,都可以通过HQL来实现。
分组
在上一部分,已经涉及到了分组的概念。分组操作的是行的集合。它根据某一列(属性)对记录集进
行分组。这一切是通过group子句实现的。如下的例子描述了group子句的一般用法。
select count(o) from Order o having o.priceTotal >= 1200 and o.priceTotal <= 3200 group by
o.id
HQL中的分组和SQL中的分组类似。总之,除了一些对SQL的特殊扩展外,其它所有的SQL功能都可以使
用HQL描述。在接下来的部分,让我们举例说明如何在java中使用HQL。
在java中使用HQL
到现在为止,我们已经学习了HQL的基本用法。接下来我们举一个例子来说明如何在Java中使用HQL。
下面的例子只给出了主要的部分,由于本文只是讨论HQL的用法,因此,关于Hibernate的一些设置和在
main()函数中调用Hibernate的部分并未给出,读者可以参考相关的文当。现在让我们看看下面的例子。
下面是必须引用的包
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.*
import com.Order;
下面是类的声明
public class MyOrder
{
… …
}
下面让我们来实现MyOrder类的构造函数
public class MyOrder
{
SessionFactory sf;
public MyOrder()
{
Configuration cfg = new Configuration().addClass(Order.class);
sf = cfg.buildSessionFactory();
}
… …
}
下面的getOrder函数根据priceTotal的区间值返回Order对象。
public class MyOrder
{
…. ….
public Order getOrder(String lower, String upper)
{
// 打开一个会话
Session sess = sf.openSession();
// HQL语句
String query = "select o from o "
+ "Order as o join o.products as p "
+ "where o.priceTotal > :priceTotalLower"
+ "and o.priceTotal< :priceTotalUpper";
Query q = sess.createQuery(query);
// 将两个参数传入HQL中
q.setDouble("priceTotalLower", Double.parseDouble(lower));
q.setDouble("priceTotalUpper", Double.parseDouble(upper));
List list = q.list();
Order o=(Order)list.iterator.next();
return o;
}
… …
}
下面的main函数将测试MyOrder类
public class MyOrder
{
… …
public static void main(String args[])
{
Order o=MyOrder().getOrder(“100”, “300”);
System.out.println(“id=”+ o.id);
… …
}
}
小结
上述的代码演示了如何在Java中使用HQL,但HQL还有两点需要注意一下:
1. HQL并不区分字母的大小写,但在HQL中的Java类和属性名必须和实际的类和属性名一致。如
SELECT和select之间可以互换,但Order和order却代表不同的含义。
2. 如果HQL中引用的类未被导入,在HQL中必须引用具体的包。如本例中,如果com.Order未被导入,
在HQL中必须将Order写成com.Order。
运的是,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语句:
select * from order
from 是最简单的查询子句。from后面可以跟一个或多个类名(类名也可以带有别名)。为了得到
Order和Product的所有实例,可以使用如下的查询:
from Order, Product
和类名一样,别名也可以在from后使用,如下代码如示:
from Order as o, Product p
当查询很复杂时,加入别名可以减少语句的长度。我们可以看看如下的SQL语句:
select o.*, p.* from order o, product p where o.order_id = p.order_id
我们可以很容易看出,上面的查询是一对多的关系。在HQL中相当于一个类中包含多个其它类的实例
。因此,以上的SQL写成HQL就是:
from Order as o inner join o.products as product
现在让我们考虑另外一个从表中得到指定属性的情况。这就是最常用的select子句。这在HQL中的工
作方式和SQL中一样。而在HQL中,如果只是想得到类的属性的话,select语句是最后的选择。以上的SQL
可以使用select子句改成如下的HQL语句:
select product from Order as o inner join o.products as product
以上的HQL语句将返回Order中的所有Products实例。如果要得到对象的某一个属性,可以将HQL语句
写成如下的形式:
select product.name from Order as o inner join o.products as product
如果要得到多个对象的属性,可以将HQL语句写成如下形式:
select o.id, product.name from Order as o inner join o.products as product
接下来,我们将进入下一个议题。假设我们需要根据某些条件得到数据。那么以上所述的HQL语句将
无法满足需求。为了达到这一目的,我们就要用到下面将要讨论的约束子句。
约束
从以上可知,投影返回的是所有的数据。但在大多数时候我们并不需要这么多数据。这就需要对数据
进行过滤。在HQL中过滤数据的子句和SQL一样,也是where。它的语法类似于SQL,通过where子句,可以
对行进行过滤。我们可以看看下面的SQL语句:
select * from orders where id = ‘1234’
这条查询语句返回了id等于1234的所有的字段。和这条SQL对等的是下面的HQL语句:
select o from Order o where o.id=’1234’
从以上两条语句可以看出,它们的where子句非常相似。而它们唯一的不同是SQL操作的是记录,而
HQL操作的是对象。在HQL中,除了where子句可以过滤数据外,having子句也可以做到这一点(关于
having子句的详细内容我将在分组部分讨论)。投影和约束是两个基本的操作,这两个操作再加上聚合函
数的话,那HQL将变得更加强大。下面我们就来讨论什么是聚合。
聚合
上述的查询都是将每一个记录(对象)当做一个单位,而如果使用聚合,可以将一类记录(对象)当
做一个单位。然后再对每一类的记录(对象)进行一系列地操作,如对某一列取平均值、求和、统计行数
等等。HQL支持以下的聚合函数:
1. avg(…), sum(…)
2. min(…), max(…)
3. count(*), count(…), count(distinct…), count(all…)
以上的聚合函数都返回数值类型。这些操作都可以在select子句中使用,如下所示:
select max(o.priceTotal) + max(p.price) from Order o join o.products p group by o.id
以上的HQL语句返回了两个值的和:orders表中的priceTotal的最大值和products表中的price的最大
值之和。我们还可以使用having子句对分组进行过滤。如我们想按id统计priceTotal小于1000的数量可按
如下的HQL语句去实现:
select count(o) from Order o having o.priceTotal < 1000 group by o.id
我们还可以将聚合函数和having子句一起使用。如我们要按products表的id统计price小于amount的
平均数的产品数量,HQL语句如下:
select count(p) from Product p having p.price < avg(amount) group by p.id
从上面的一系列的HQL语句可以看出,所有通过SQL实现的,都可以通过HQL来实现。
分组
在上一部分,已经涉及到了分组的概念。分组操作的是行的集合。它根据某一列(属性)对记录集进
行分组。这一切是通过group子句实现的。如下的例子描述了group子句的一般用法。
select count(o) from Order o having o.priceTotal >= 1200 and o.priceTotal <= 3200 group by
o.id
HQL中的分组和SQL中的分组类似。总之,除了一些对SQL的特殊扩展外,其它所有的SQL功能都可以使
用HQL描述。在接下来的部分,让我们举例说明如何在java中使用HQL。
在java中使用HQL
到现在为止,我们已经学习了HQL的基本用法。接下来我们举一个例子来说明如何在Java中使用HQL。
下面的例子只给出了主要的部分,由于本文只是讨论HQL的用法,因此,关于Hibernate的一些设置和在
main()函数中调用Hibernate的部分并未给出,读者可以参考相关的文当。现在让我们看看下面的例子。
下面是必须引用的包
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.*
import com.Order;
下面是类的声明
public class MyOrder
{
… …
}
下面让我们来实现MyOrder类的构造函数
public class MyOrder
{
SessionFactory sf;
public MyOrder()
{
Configuration cfg = new Configuration().addClass(Order.class);
sf = cfg.buildSessionFactory();
}
… …
}
下面的getOrder函数根据priceTotal的区间值返回Order对象。
public class MyOrder
{
…. ….
public Order getOrder(String lower, String upper)
{
// 打开一个会话
Session sess = sf.openSession();
// HQL语句
String query = "select o from o "
+ "Order as o join o.products as p "
+ "where o.priceTotal > :priceTotalLower"
+ "and o.priceTotal< :priceTotalUpper";
Query q = sess.createQuery(query);
// 将两个参数传入HQL中
q.setDouble("priceTotalLower", Double.parseDouble(lower));
q.setDouble("priceTotalUpper", Double.parseDouble(upper));
List list = q.list();
Order o=(Order)list.iterator.next();
return o;
}
… …
}
下面的main函数将测试MyOrder类
public class MyOrder
{
… …
public static void main(String args[])
{
Order o=MyOrder().getOrder(“100”, “300”);
System.out.println(“id=”+ o.id);
… …
}
}
小结
上述的代码演示了如何在Java中使用HQL,但HQL还有两点需要注意一下:
1. HQL并不区分字母的大小写,但在HQL中的Java类和属性名必须和实际的类和属性名一致。如
SELECT和select之间可以互换,但Order和order却代表不同的含义。
2. 如果HQL中引用的类未被导入,在HQL中必须引用具体的包。如本例中,如果com.Order未被导入,
在HQL中必须将Order写成com.Order。
发表评论
-
Hibernate事务与并发问题处理
2013-08-03 17:11 617数据库事务,是指作为单个逻辑工作单元执行的一系列操作。事务处理 ... -
Hibernate数据查询
2009-05-27 17:57 1718转载:http://blog.csdn.net/l ... -
Hibernate中级联操作cascade选项
2009-05-27 17:42 966转载:http://blog.csdn.net/lenotan ... -
Hibernate QBC高级查询
2009-05-27 17:39 1517转载:http://blog.csdn.net/l ... -
hibernate实体N对N映射实例(1)
2009-04-30 17:21 1229转载:http://hi.baidu.com/yuanquan ... -
HQL查询及语法
2009-03-31 09:56 1242转载:http://blog.chinaunix.net ... -
Hibernate的主键生成方式
2009-03-26 16:53 900Hibernate中,<id>标签下的可选< ... -
Hibernate3.2对sqlserver2005查询分页的处理
2009-03-26 16:49 1284对Hibernate的查询分页,想必大家都比较熟悉了。setF ... -
Hibernate之---实体映射
2009-03-26 12:17 921转载:http://hi.baidu.com/javajava ... -
Hibernate之---复合主键
2009-03-26 12:16 1352转载:http://hi.baidu.com/javajava ... -
Hibernate过滤器
2009-03-26 12:12 1053import java.io.IOException; ... -
HibernateUtil.java
2009-03-26 12:11 2370import javax.naming.InitialCo ... -
HibernateDAO.java
2009-03-26 12:10 1261import java.util.List; /** ... -
Hibernate配置文件中配置各种数据库的driver、URL
2009-03-26 12:07 8945hibernate.properties ##### ... -
hql的几种常见形式
2009-03-23 18:52 1565session.createQuery(hql); Hibe ... -
Hibernate查询实体对象
2009-03-23 18:51 2218n+1问题:在默认情况下,使用query.iterator() ... -
Hibernate的缓存
2009-03-23 18:49 973转载:http://hi.baidu.com/javajava ... -
Hibernate存取图片示例
2009-03-03 17:29 1460一般网站在处理用户上传图片时通常采用两种策略:一是直接把图片存 ... -
转一个hibernate泛型DAO的例子
2009-02-27 17:34 3827转载:http://blog.csdn.net/dingx ... -
HibernateTemplate相关方法
2009-02-27 17:21 3104转载:http://blog.csdn.net/m ...
相关推荐
在WebLogic 12环境中部署应用程序时,如果应用依赖于特定版本的Hibernate框架,并且该版本与WebLogic服务器默认提供的Hibernate版本存在差异,则可能会导致`org.hibernate.hql.ast.HqlToken`类冲突。此类冲突主要...
hibernate-HQL语句大全
2. 避免在HQL中使用SQL函数:尽量用Hibernate提供的函数,以确保跨数据库兼容性。 3. 优化查询性能:合理设计数据库索引,避免全表扫描,尽量减少JOIN操作。 总之,Hibernate-HQL是Java开发中处理数据库查询的重要...
对hibernate的hql进行了详尽的讲解
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...
"Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...
### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...
对Hibernate中HQL语句的讲解
Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...
- `setString(String paraName, String value)`:设置HQL中通过`:paraName`指定的参数值。 - **list()**:执行查询并返回查询结果列表。 - **executeUpdate()**:执行更新或删除操作。 #### Select子句 - **...
本文将重点介绍Hibernate中的关联查询,并深入探讨HQL关联查询的实现原理及应用场景。 #### 二、数据库表连接概述 在理解Hibernate HQL关联查询之前,我们需要先回顾一下数据库表连接的基本概念及其分类。数据库表...
【描述】:在ORM框架Hibernate中,数据查询和检索是一个核心功能,它提供了多种查询方式,包括标准化对象查询(Criteria Query)、Hibernate查询语言(HQL)和原生SQL查询。其中,HQL作为官方推荐的查询方式,具有...
hibernate3-hql.jar .
通过上述介绍,我们可以了解到 HQL 在 Hibernate 中的重要性和实用性。它不仅提供了简洁易用的语法,还支持多种复杂的查询操作。对于初学者来说,掌握 HQL 的基本用法是非常重要的,这有助于更好地理解和应用 ...
Hibernate是一款强大的...总的来说,Hibernate的HQL jar是Java开发中用于简化数据库操作的重要组件,结合Hibernate框架,可以极大地提高开发效率和代码质量。理解并熟练使用HQL,可以让你在Java ORM领域更上一层楼。
**hibernate-HQL用例** ...通过深入学习并实践这些HQL用例,开发者可以更好地理解如何在Hibernate中有效地操作数据库,提升开发效率。在实际项目中,熟练运用HQL能够使代码更加简洁,降低维护成本。
hibernate hql 语法学习的文档
在HQL中,我们可以使用`like`关键字来进行模糊查询。`like`关键字后面可以跟一个包含通配符的字符串。常见的通配符有: - `%`:代表零个、一个或多个任意字符。 - `_`:代表一个任意字符。 例如,如果我们有一个`...