CodeGym /課程 /All lectures for TW purposes /學習用 HQL 編寫查詢

學習用 HQL 編寫查詢

All lectures for TW purposes
等級 1, 課堂 829
開放

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 類型。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION