1.1 HQL简介

之前,您已经熟悉了 Hibernate,现在我将向您介绍HQL,又名Hibernate Query Language。实际上,这是为在 Hibernate 中编写查询而转换的 SQL。它有几个关键的区别。

  1. 使用类名而不是表名。
  2. 使用类字段名而不是表列名。
  3. 选择的可选使用。

让我们让 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 类型。