HQL (Hibernate Query Language) 面向對象、類 SQL、支持繼承多態,是 Hibernate 官方推薦查詢方式。
SELECT/UPDATE/DELETE ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... ASC/DESC
from User user from User user where user.age = 20 from User user where user.age between 20 and 30 from User user where user.name like '%zx%' from Employee e -- 會自動包含子類 HourlyEmployee、SalariedEmployee
Hibernate 3+ 新增,無需先查再改,直接執行 SQL 級批量操作,性能大幅提升。
// 更新 String hql = "update User user set user.age=20 where user.age=18"; int ret = session.createQuery(hql).executeUpdate(); // 刪除 String hql = "delete from User user where user.age=18"; int ret = session.createQuery(hql).executeUpdate();
注意:批量操作繞過 Session 緩存,可能導致緩存與數據庫不一致,慎用於需同步緩存的場景。
// 單屬性,返回 Listselect user.name from User user // 多屬性,返回 List
from User user order by user.name asc, user.age desc
select count(user), user.age from User user group by user.age having count(user) > 10
關聯查詢時,select c.id, c.name, o.id ... 返回關系數據(Object[]),不進 Session 緩存,內存佔用低、無同步開銷,適合只讀統計報表。
| 方式 | 語法示例 | 適用場景 |
|---|---|---|
| 命名參數 | :name → query.setString("name", val) | 可讀性強、易維護,推薦 |
| 位置參數 | ? → query.setString(0, val) | 簡單查詢 |
| setParameter | query.setParameter("name", val, Hibernate.STRING) | 類型不明確時 |
| setProperties | query.setProperties(userEntity) | 實體屬性與參數同名 |
// 拼接字符串(危險)
"from User where name='" + name + "'"
// 命名參數(安全)
"from User where name=:name"
query.setString("name", name); // 輸入 'zhaoxin or 'x'='x' 會被轉義為字面值
HQL 兼具面向對象與 SQL 靈活性,掌握批量操作、屬性投影、統計優化、參數綁定四大核心技巧,能顯著提升數據訪問層性能與安全性。