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 類似於“測試”

查詢非常相似,當您熟悉類名及其字段時閱讀 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 類型。