1.1 HQL简介
之前,您已经熟悉了 Hibernate,现在我将向您介绍HQL,又名Hibernate Query Language。实际上,这是为在 Hibernate 中编写查询而转换的 SQL。它有几个关键的区别。
- 使用类名而不是表名。
- 使用类字段名而不是表列名。
- 选择的可选使用。
让我们让 Hibernate 返回给我们它在数据库中的所有用户。该请求如下所示:
from User
仅此而已,为了比较,我们在 SQL 中提供了一个类似的查询:
select * from user
这里User
是类名,user
是表名。
完整的 Java 代码如下所示:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
否则,HQL 与 SQL 非常相似——它也有运算符:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 使用 HQL 的例子
由于相同的表名和字段名,前面的示例可能有点混乱。让我们想出一个特殊的例子,这样会更容易。
假设我们有一个包含以下字段的user_data表:
- 标识符整数
- 用户名VARCHAR(100)
- 用户级别INT
- 用户创建日期
我们将创建一个映射到该表的 Java 类:
@Entity
@Table(name="user_data")
class User {
@Id
@GeneratedValue
public Integer id;
@Column(name="user_name")
public String name;
@Column(name="user_level")
public Integer level;
@Column(name="user_created")
public Date created;
}
现在让我们写一些例子:
高质量语言 | 数据库 |
---|---|
来自用户 | 从用户数据中选择 * |
来自 id=3 的用户 | 从 id=3 的用户数据中选择 * |
来自 (10,20,30) 级别的用户 | 选择 * from user_data where user_level IN (10, 20, 30) |
来自用户订单创建的asc | 从 user_data order by user_created asc 选择 * |
来自名称为“测试”的用户 | 从 user_data 中选择 *,其中 user_name 类似于“test” |
查询非常相似,当您熟悉类名及其字段时阅读 HQL 查询就像阅读 SQL 查询一样容易。可能写起来有点困难,但话又说回来,非常复杂的查询很少用 HQL 编写。
1.3 使用选择
select
在 HQL 中,当结果的数据类型与 中指定的类型不匹配时,可以使用from
。
例如,我们想要获取user_data表中所有用户的姓名,那么我们需要编写以下查询:
select name from User
此外,如果名称之间存在重复,则可以使用运算符DISTINCT
:
select distinct name from User
别名与 SQL 中的一样:
select distinct u.name from User u where u.created > '2020-01-01'
那么,完全以 Java 代码的形式,这个请求将如下所示:
public List<String> getUserNames() {
try (Session session = sessionFactory.openSession()) {
String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
Query<String> query = session.createQuery(hql , String.class);
return query.list();
}
}
请注意,查询必须返回一个名称列表。名称是 String 类型,因此函数的类型和 Query 类的类型参数都是 String 类型。
GO TO FULL VERSION