来自:http://home.51.com/haitao0204/diary/item/10016697.html
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。
相关推荐
本文将深入解析HQL语句的常见用法。 1. 大小写敏感性 HQL对Java类和属性的名称是大小写敏感的,但在关键字和表名方面,除了类名和属性名之外,HQL不区分大小写。因此,`SeLeCT`、`sELEct`和`SELECT`被视为相同,但`...
### HQL语句使用大全 HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的数据检索方式,使开发人员能够更高效地与数据库交互。本文将详细介绍HQL的基本用法及高级特性。 #### 1. ...
标题:“全面解析HQL语句 非常详细直接的HQL语句的功能介绍” 描述:“非常详细直接实用的HQL语句的功能介绍看过的人保准都说好” 本篇文章将深入探讨HQL(Hibernate Query Language)的核心功能及其在数据查询...
- 使用Session的`createQuery`方法来创建Query对象,并将HQL语句作为参数传入。 ```java Query query = session.createQuery(hql); ``` 4. **设置参数值** - 如果HQL语句中有参数,则需要为这些参数设置值。 ...
### HQL语句详解:精通Hibernate查询语言 #### 引言 HQL(Hibernate Query Language)是Hibernate框架中用于执行数据库操作的一种强大的查询语言。它提供了面向对象的语法,允许开发人员以一种接近于编程语言的方式...
HQL语句的语法结构与SQL相似,但更注重对象和类的概念。以下将详细介绍HQL语句的几个关键部分: 1. **from 子句**:这是HQL查询的起点,用于指定要查询的持久化类。例如,`from Person as p`表示从`Person`类中选择...
Hibernate中HQL语句的使用 HQL(Hibernate Query Language)是 Hibernate 框架中的一种查询语言,它允许开发者使用面向对象的方式来查询数据库。HQL语句的使用是Hibernate中最重要的部分之一,本文将详细介绍HQL...
HQL语句查询
Hibernate框架中,在使用HQL语句时,需要传递参数,而在HQL语句中使用in关键字时,需要特别注意参数的传递方式。在本文中,我们将讨论如何在HQL语句中使用in关键字带参数的写法,以及解决相关问题的方法。 一、HQL...
### HQL语句语法详解 HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的机制来查询数据库中的数据,并将其映射到Java对象上。本篇文章将根据给定的信息深入探讨HQL的基本语法结构...
以下是一些常用HQL语句的使用与说明: 1. **HQL更新语句**: 更新操作允许您修改数据库中的对象属性。在示例中,第4行的HQL语句`update PhUser set realName=?`用于更新`PhUser`表中所有记录的`realName`字段。第5...
例如,要将年龄为18的用户更新为20岁,可以使用以下HQL语句: ```java Transaction trans = session.beginTransaction(); String hql = "update User user set user.age = 20 where user.age = 18"; Query query...
约束函数用于过滤数据,在 HQL 中使用 where 子句实现约束操作。where 子句的语法类似于 SQL,通过 where 子句可以对行进行过滤。 例如,select o from Order o where o.id='1234' 将返回 id 等于 1234 的所有订单...
HQL(Hibernate Query Language)是Hibernate框架中用于...以上内容涵盖了HQL的基础用法,包括ID生成策略、基本查询语句、集合参数传递和不同的传参方式。通过这些知识点,你可以更有效地使用Hibernate进行数据库操作。
"Hibernate-HQL语句多对多写法" Hibernate 是一个流行的 Java 持久层框架,它提供了强大的对象关系映射(ORM)功能,使得开发者可以方便地与数据库交互。但是,在使用 Hibernate 时,我们经常会遇到多对多关系的...
一种方法是动态构建Hql语句,将数组元素拼接成一个逗号分隔的字符串,然后在`in`子句中使用这个字符串。例如,`id in ('1','2','3')`。另一种方法是使用Hibernate的参数绑定功能,直接将数组作为参数传递,Hibernate...
* HQL 语句可以使用 where 字句,并可以在 where 字句中使用各种表达式、比较操作符、 Logical 操作符等。 * HQL 语句可以用于查询继承关系中的实体对象,例如:from Employee,可以检索出所有 Employee 类型实体...