HQL查詢
HQL是Hibernate Query Language的縮寫,HQL的語法很像SQL的語法,但是HQL是一種面向對象的查詢語言。
因此,SQL的操作對象的數據表和列等數據對象,而HQL的操作對象是類、實例、屬性等。
HQL是完全面向對象的查詢語言,因此可以支持繼承和多態等特徵。
HQL查詢依賴Query類,每個Query實例對應一個查詢對象。
1、通常,set xxx()方法的返回值都是void,但是hibernate Query的set XXX()方法的返回值是Query本書,
因此,程序通過Session創建Query後,直接多次調用set XXX()方法爲HQL語句的參數賦值,再直接調用list()
方法返回查詢後的全部結果即可。
Query還包含兩個方法:
setFirstResult(int firstResult),設置返回的結果集從第幾條記錄開始
setMaxResult(int maxResult),設置本次查詢返回的結果數。
這兩個方法用於實現Hibernate分頁。
2、HQL查詢的聚集函數
avg —— 計算屬性的平均值
count —— 統計選擇對象的數量
max —— 統計屬性值的最大值
min —— 統計屬性值的最小值
sum —— 計算屬性值的總和。
Example:
select count (*) from Person 查詢Person類中實例的個數
select max (p.age) from Person as p 查詢Person類中年齡的最大值
3、HQL查詢的where子句
where子句用於篩選選中的結果,縮小選擇的範圍。如果沒有爲持久化實例命名別名,
可以直接使用屬性名引用。
如: from Person where name like ' tom% ' 等同於 from Person as p where p.name like " tom% "
返回name屬性以tom開頭的實例。
4、表達式
HQL的功能非常豐富,where子句後支持的運算符異常豐富,不近包括SQL的運算符,還包括EJB-QL的運算符
where子句中允許使用大部分SQL支持的表達式:
數學運算符: +、-、*、/等
二進制比較運算符:=、 >=、 <=、 <>、!=、like等
邏輯運算符:and、or 、not等
in、not in 、 between 、 is null 、 is not null 、 is empty 、 member of 和not member of等。
簡單的case、 case....when..then...else...end和case、case when.....then....else....end等
字符串連接符value1 || value2 或使用字符串連接函數 concat(value1,value2)。
時間操作函數 current_date()、 current_time()、current_timestamp()、second()、minute()、hour()、
day()、month()、year()等。
HQL還支持EJB_QL3.0所支持的函數或操作substring()、trim()、lower()、upper()、length()、
locate()、abs()、sqrt()、bit_length()、coalesce()和nullif()等
Example:
in 與 between....and的用法:
from Person p where p.name between ' A 'and ' B '
from Person p where p.name in (”abc“,"tom","joan")
5、 order by 子句
查詢返回的列表(list)可以根據類或組件屬性的任何屬性值進行排序。
Example:
from Person as p order by p.name,p.age 根據人的名字和年齡升序排列
from Person as p order by p . age desc 根據人的年齡倒序排列
默認情況下是升序即asc,用desc則是倒序排列。