- Hibernate 教程
- Hibernate - 首页
- ORM - 概述
- Hibernate - 概述
- Hibernate - 架构
- Hibernate - 环境
- Hibernate - 配置
- Hibernate - 会话
- Hibernate - 持久化类
- Hibernate - 映射文件
- Hibernate - 映射类型
- Hibernate - 示例
- Hibernate - 对象关系映射
- Hibernate - 级联类型
- Hibernate - 注解
- Hibernate - 查询语言
- Hibernate - Criteria 查询
- Hibernate - 原生 SQL
- Hibernate - 缓存
- Hibernate - 实体生命周期
- Hibernate - 批处理
- Hibernate - 拦截器
- Hibernate - ID 生成器
- Hibernate - 保存图片
- Hibernate - log4j 集成
- Hibernate - Spring 集成
- Hibernate - Struts 2 集成
- Hibernate - Web 应用
- 映射表示例
- Hibernate - 基于层次结构的表映射
- Hibernate - 基于具体类的表映射
- Hibernate - 基于子类的表映射
- Hibernate 有用资源
- Hibernate - 问答
- Hibernate - 快速指南
- Hibernate - 有用资源
- Hibernate - 讨论
Hibernate - 查询语言
Hibernate 查询语言 (HQL) 是一种面向对象的查询语言,类似于 SQL,但它不是操作表和列,而是操作持久化对象及其属性。HQL 查询由 Hibernate 转换为传统的 SQL 查询,后者再对数据库执行操作。
虽然您可以使用原生 SQL 直接在 Hibernate 中使用 SQL 语句,但我建议尽可能使用 HQL,以避免数据库移植方面的麻烦,并利用 Hibernate 的 SQL 生成和缓存策略。
SELECT、FROM 和 WHERE 等关键字不区分大小写,但表和列名在 HQL 中区分大小写。
FROM 子句
如果您想将完整的持久化对象加载到内存中,可以使用 FROM 子句。以下是使用 FROM 子句的简单语法:
String hql = "FROM Employee"; Query query = session.createQuery(hql); List results = query.list();
如果您需要在 HQL 中完全限定类名,只需指定包名和类名,如下所示:
String hql = "FROM com.hibernatebook.criteria.Employee"; Query query = session.createQuery(hql); List results = query.list();
AS 子句
AS 子句可用于为 HQL 查询中的类分配别名,尤其是在查询很长的情况下。例如,我们之前的简单示例如下所示:
String hql = "FROM Employee AS E"; Query query = session.createQuery(hql); List results = query.list();
AS 关键字是可选的,您也可以在类名后直接指定别名,如下所示:
String hql = "FROM Employee E"; Query query = session.createQuery(hql); List results = query.list();
SELECT 子句
SELECT 子句比 FROM 子句提供对结果集的更多控制。如果您想获取对象的某些属性而不是整个对象,请使用 SELECT 子句。以下是使用 SELECT 子句仅获取 Employee 对象的 first_name 字段的简单语法:
String hql = "SELECT E.firstName FROM Employee E"; Query query = session.createQuery(hql); List results = query.list();
这里需要注意的是,Employee.firstName 是 Employee 对象的属性,而不是 EMPLOYEE 表的字段。
WHERE 子句
如果您想缩小从存储中返回的特定对象范围,可以使用 WHERE 子句。以下是使用 WHERE 子句的简单语法:
String hql = "FROM Employee E WHERE E.id = 10"; Query query = session.createQuery(hql); List results = query.list();
ORDER BY 子句
要对 HQL 查询的结果进行排序,需要使用 ORDER BY 子句。您可以按结果集中的对象的任何属性进行排序,升序 (ASC) 或降序 (DESC)。以下是使用 ORDER BY 子句的简单语法:
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC"; Query query = session.createQuery(hql); List results = query.list();
如果您想按多个属性排序,只需将其他属性添加到 ORDER BY 子句的末尾,并用逗号分隔,如下所示:
String hql = "FROM Employee E WHERE E.id > 10 " + "ORDER BY E.firstName DESC, E.salary DESC "; Query query = session.createQuery(hql); List results = query.list();
GROUP BY 子句
此子句允许 Hibernate 从数据库提取信息,并根据属性值对其进行分组,通常使用结果包含聚合值。以下是使用 GROUP BY 子句的简单语法:
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " + "GROUP BY E.firstName"; Query query = session.createQuery(hql); List results = query.list();
使用命名参数
Hibernate 在其 HQL 查询中支持命名参数。这使得编写接受用户输入的 HQL 查询变得容易,并且您不必防御 SQL 注入攻击。以下是使用命名参数的简单语法:
String hql = "FROM Employee E WHERE E.id = :employee_id"; Query query = session.createQuery(hql); query.setParameter("employee_id",10); List results = query.list();
UPDATE 子句
批量更新是 Hibernate 3 中 HQL 的新增功能,删除操作在 Hibernate 3 中的工作方式与 Hibernate 2 中有所不同。Query 接口现在包含一个名为 executeUpdate() 的方法,用于执行 HQL UPDATE 或 DELETE 语句。
UPDATE 子句可用于更新一个或多个对象的属性。以下是使用 UPDATE 子句的简单语法:
String hql = "UPDATE Employee set salary = :salary " + "WHERE id = :employee_id"; Query query = session.createQuery(hql); query.setParameter("salary", 1000); query.setParameter("employee_id", 10); int result = query.executeUpdate(); System.out.println("Rows affected: " + result);
DELETE 子句
DELETE 子句可用于删除一个或多个对象。以下是使用 DELETE 子句的简单语法:
String hql = "DELETE FROM Employee " + "WHERE id = :employee_id"; Query query = session.createQuery(hql); query.setParameter("employee_id", 10); int result = query.executeUpdate(); System.out.println("Rows affected: " + result);
INSERT 子句
HQL 只支持INSERT INTO 子句,用于将记录从一个对象插入到另一个对象。以下是使用 INSERT INTO 子句的简单语法:
String hql = "INSERT INTO Employee(firstName, lastName, salary)" + "SELECT firstName, lastName, salary FROM old_employee"; Query query = session.createQuery(hql); int result = query.executeUpdate(); System.out.println("Rows affected: " + result);
聚合方法
HQL 支持一系列聚合方法,类似于 SQL。它们在 HQL 中的工作方式与在 SQL 中相同,以下是可用函数的列表:
序号 | 函数及说明 |
---|---|
1 |
avg(属性名) 属性值的平均值 |
2 |
count(属性名或 *) 属性在结果中出现的次数 |
3 |
max(属性名) 属性值的最大值 |
4 |
min(属性名) 属性值的最小值 |
5 |
sum(属性名) 属性值的总和 |
distinct 关键字只计算行集中的唯一值。以下查询将只返回唯一计数:
String hql = "SELECT count(distinct E.firstName) FROM Employee E"; Query query = session.createQuery(hql); List results = query.list();
使用 Query 进行分页
Query 接口有两种分页方法。
序号 | 方法及说明 |
---|---|
1 |
Query setFirstResult(int startPosition) 此方法接受一个整数,表示结果集中的第一行,从第 0 行开始。 |
2 |
Query setMaxResults(int maxResult) 此方法告诉 Hibernate 检索固定数量的 maxResults 对象。 |
结合使用以上两种方法,我们可以在 Web 或 Swing 应用程序中构建分页组件。以下是一个示例,您可以将其扩展为一次获取 10 行数据:
String hql = "FROM Employee"; Query query = session.createQuery(hql); query.setFirstResult(1); query.setMaxResults(10); List results = query.list();