首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

HQL 語法詳解:從實體查詢到批量更新、分組統計與參數綁定

     編輯:Java 綜合教學

HQL 語法詳解:從實體查詢到批量更新、分組統計與參數綁定

HQL (Hibernate Query Language) 面向對象、類 SQL、支持繼承多態,是 Hibernate 官方推薦查詢方式。

完整 HQL 結構

SELECT/UPDATE/DELETE ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... ASC/DESC

1. 實體查詢

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

2. 批量更新與刪除

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 緩存,可能導致緩存與數據庫不一致,慎用於需同步緩存的場景。

3. 屬性查詢與動態構造

// 單屬性,返回 List
select user.name from User user

// 多屬性,返回 List
select user.name, user.age from User user

// 動態構造實體(非持久化對象,無 ID,不能直接 update)
select new User(user.name, user.age) from User user

4. 分組與排序

ORDER BY

from User user order by user.name asc, user.age desc

GROUP BY + 聚合

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 緩存,內存佔用低、無同步開銷,適合只讀統計報表。

5. 參數綁定(防注入、利用預編譯)

方式語法示例適用場景
命名參數:name → query.setString("name", val)可讀性強、易維護,推薦
位置參數? → query.setString(0, val)簡單查詢
setParameterquery.setParameter("name", val, Hibernate.STRING)類型不明確時
setPropertiesquery.setProperties(userEntity)實體屬性與參數同名

防 SQL 注入示例

// 拼接字符串(危險)
"from User where name='" + name + "'"
// 命名參數(安全)
"from User where name=:name"
query.setString("name", name); // 輸入 'zhaoxin or 'x'='x' 會被轉義為字面值

總結

HQL 兼具面向對象與 SQL 靈活性,掌握批量操作、屬性投影、統計優化、參數綁定四大核心技巧,能顯著提升數據訪問層性能與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved