- 浏览: 495856 次
- 性别:
文章分类
- 全部博客 (369)
- Java (48)
- Struts (1)
- Spring (4)
- Hibernate (7)
- WebServices (2)
- XML (3)
- web服务器 (12)
- PHP (16)
- FLEX (13)
- Flash (7)
- JavaScript (35)
- Ajax (4)
- Jquery (18)
- EXTJS (7)
- CSS (7)
- HTML (7)
- JSON (5)
- 好玩的 (1)
- 其他 (21)
- Oracle (35)
- mysql (12)
- Linux (12)
- JDBC (2)
- EJB3 (1)
- AOP (1)
- 正则表达式 (6)
- JSF (1)
- 设计模式 (1)
- RBAC (1)
- PowerDesigner (1)
- windows (1)
- 电脑工具软件 (3)
- SEO (3)
- maven (13)
- cms (9)
- JSP (5)
- jpbm (1)
- eclipse (8)
- sql (4)
- android (3)
- 浏览器 (5)
- 国外IT网站 (1)
- 文摘 (1)
- 文档 (31)
- doc命令 (1)
- webgl (1)
- html5 (1)
- ant (1)
- mongodb (0)
- 操作系统 (1)
- Dreamweaver (1)
- hadoop (2)
- xpath (1)
- nutch (1)
- window (1)
- xm (2)
- excel (1)
- httpclient (0)
- YII (2)
- CXF (1)
- Quartz (1)
- jsoup (2)
- wifi (2)
- logback (1)
- 硬件 (1)
- 工具 (3)
- freemark (1)
- ide (2)
- mail (1)
- log (1)
- ueditor (1)
- 链接 (1)
- reaver (2)
- js (1)
- .net (1)
- chrome (1)
- git (1)
- Docker (1)
- unicode (1)
- 多线程 (1)
- 并发 (1)
- Nashorn (3)
- Angular (1)
- curl (1)
- Cygwin (1)
- nashron (1)
- Babel (1)
- React Native (1)
- sip (1)
- openmeetings (1)
- IDEA (0)
- CAS (1)
最新评论
-
沉醉音乐的咖啡:
使用 preventDefault() 函数来阻止对表单的提交。 -
PhoenixHorse:
原表的索引啥的不就失效了吗
oracle修改表精度 -
yupengcc:
资料带走 3Q
RBAC模型 -
Java路:
...
JSON-LIB快速入门(转) -
damoqiongqiu:
utf-8下,E文字符占1个字节,中文字符占3个字节。如果一个 ...
AS3:截取定长度的字符串
http://www.svn8.com/java/edu/200902/10-2344.html
传统的SQL语言采用的是结构化的查询方法,而这种方法对于查询以对象形式存在的数据却无能为力。幸运的是,Hibernate为我们提供了一种语法类似于 SQL的语言,Hibernate查询语言(HQL),和SQL不同的是,HQL是一种面向对象的查询语言,它可以查询以对象形式存在的数据。因此
传统的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。
传统的SQL语言采用的是结构化的查询方法,而这种方法对于查询以对象形式存在的数据却无能为力。幸运的是,Hibernate为我们提供了一种语法类似于 SQL的语言,Hibernate查询语言(HQL),和SQL不同的是,HQL是一种面向对象的查询语言,它可以查询以对象形式存在的数据。因此
传统的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。
发表评论
-
ResultToBean
2016-05-16 16:56 488package util; import java. ... -
hibernate sql to Object
2016-01-15 18:01 0package com.sf.cmdm.core.prot ... -
spring hibernate 获取当前线程connection
2015-12-01 16:17 754threadLocal实现参考TransactionSynch ... -
Hibernate log4j 显示sql参数值
2014-09-26 09:03 630log4j.logger.org.hibernate=IN ... -
hibernate boolean maping(0,1;Tt,Ff;Yy,Nn)
2014-09-23 08:57 463http://docs.jboss.org/hibernate ... -
hibernate criteria添加 sql条件
2014-04-10 09:59 698deptCr.add(Restrictions.sqlRest ... -
HQL多对多查询语句
2011-11-03 12:05 1137HQL多对多查询语句 一个学科表(Field) ...
相关推荐
### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...
【Hibernate HQL 深度历险】是一个关于掌握Hibernate查询语言高级特性的技术主题。Hibernate Query Language(HQL)是Hibernate框架提供的面向对象的查询语言,它与SQL类似但针对对象模型,允许开发者直接查询对象而...
《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...
Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...
Hibernate HQL基础练习小列子+数据库
HQL查询是Hibernate的核心功能之一,它能让我们以类和对象的方式来查询数据。基本语法如下: ```java Query query = session.createQuery("from EntityName where property = ?"); query.setParameter(0, value); ...
对hibernate的hql进行了详尽的讲解
这里的关键点在于使用`createQuery`方法创建了一个HQL查询对象,并通过`setString`方法设置参数值,最后通过`list`方法执行查询并获取结果列表。 #### 三、分页查询 分页查询在处理大量数据时非常有用,可以有效地...
在Hibernate中,通过Session对象的createQuery或createSQLQuery方法创建HQL查询,然后调用list、uniqueResult、scroll等方法执行查询。执行过程中,Hibernate会自动进行类型转换和结果集的封装,极大地降低了开发...
下面是一个简单的Java程序示例,展示了如何在Java中使用Hibernate框架执行HQL查询: ```java import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate....
本程序“HibernateHql综合测试小程序”是针对Hibernate中的HQL(Hibernate Query Language)进行的一系列功能测试,涵盖了二十多种不同的HQL语句,旨在帮助开发者深入理解和熟练运用Hibernate的查询能力。...
Hibernate HQL 查询语句总结 Hibernate HQL 查询语句是 Hibernate 框架中的一种查询语言,它提供了更加丰富的和灵活的查询特性,具有类似标准 SQL 语句的查询方式,同时也提供了更加面向对象的封装。以下是 ...
1. **执行HQL查询**:在Java代码中,使用`Session`对象的`createQuery()`或`createNativeQuery()`方法创建HQL查询,然后调用`list()`或`uniqueResult()`等方法获取查询结果。 2. **处理查询结果**:将查询结果转换...
### 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的设计目标是提供一种面向对象的查询方式,使得开发者能够以类和对象的角度来操作数据库,而不是直接使用...
这里使用了HQL(Hibernate Query Language)来执行查询。例如,在`getProductsMenuSub`方法中,通过以下HQL语句实现了连表查询: ```java String queryString = "select a.productsName from TopProducts as a, ...
### Hibernate HQL 查询详解 #### 一、HQL 概述 Hibernate 提供了一种非常强大的查询语言——HQL(Hibernate Query Language),它在语法上与 SQL 类似但功能更为强大,因为它支持面向对象的特性,例如继承、多态性...