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