2024年5月11日发(作者:)

系列

—————————————————————————————

“玩转”Java

Hibernate Query Language:HQL

一、HQL概述

HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言

有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方

式。它有如下特点:

●以面向对象的方式查询数据库表

●在查询语句中设定各种查询条件

●支持投影查询,即仅检索出对象的部分属性

●支持分页查询

●支持连接查询

●支持分组查询,允许使用HAVING和GROUP BY关键字

●提供内置聚集函数,如sum(),min()和max()等

●支持子查询

●支持动态绑定参数

二、语法细节

子句

在SQL中,FROM子句是用于指定要查询的数据库表,在HQL中,替换为

与数据库表对应的Java实体类即可。

例如:

SQL SELECT * FROM EMPS

HQL FROM Employee

此时HQL语句将查询数据库表中的所有字段,并自动注入到对应实体类对

象的对应属性中。

同时需要说明的是:HQL语句中FROM等关键字不区分大小写,但Java类

的类名严格区分大小写。

2.执行HQL查询语句

在Hibernate中,HQL语句由Query对象执行,Query对象可以通过Session

对象获取。

//1.通过session对象创建Query对象

String hql = "FROM Employee";

Query query = Query(hql);

//2.调用Query对象的方法获取查询结果

//结果集中有多条记录:list()

//结果集中只有一条记录:uniqueResult()

List list = ();

for (Employee employee : list) {

1

系列

—————————————————————————————

System. n(employee);

}

“玩转”Java

子句

和SQL的语法一样,HQL中的WHERE子句也用来指定查询条件。只不过这

里指定查询条件使用的不是数据库表的字段,而是Java类的属性。

例如:

SQL SELECT * FROM EMPS WHERE >5000

HQL FROM Employee e WHERE >5000

这里Employee e的语法非常像Java中声明一个Employee类型的变量:e。

其实也确实可以这样理解——使用e作为Employee对象的引用。

4.使用基于位置的占位符参数

将上例中的具体值使用占位符“?”代替,并调用Query对象的setXxx()方

法按照参数的不同类型动态填充即可,需要注意的是和JDBC中的

PreparedStatement接口不同,这里占位符的索引从0开始。

HQL FROM Employee e WHERE >?

填充占位符

ble(0, 8000);

5.使用具名参数

在HQL中不但能够使用基于位置的占位符参数,还能够使用基于名称的具

名参数,使用具名参数的好处是不必关心当前参数的索引值。

具名参数的格式是:“:参数名称”。

例如:

HQL FROM Employee e WHERE >:salaryParam

填充占位符

ble( "salaryParam", 9000);

6.以实体类对象作为参数

对于已经通过Hibernate关联关系映射建立了关联关系的实体类,HQL还支

持直接使用实体类对象本身作为参数值。

例如:Employee和Department之间建立了单向(或双向)多对一关联关系,

Employee类中使用department属性关联Department类的对象,那么HQL语句

可以为:

HQL from Employee e where ment=?

这里填充占位符可以使用一个Department对象:

Department department = new Department();

tId(5);

2