hibernate 查詢語言
hibernate 查詢語言(hql)是一種面向對象的查詢語言,類似于 sql,但不是去對表和列進行操作,而是面向對象和它們的屬性。
hql 查詢被 hibernate 翻譯為傳統的 sql 查詢從而對數據庫進行操作。
盡管你能直接使用本地 sql 語句,但我還是建議你盡可能的使用 hql 語句,以避免數據庫關于可移植性的麻煩,并且體現了 hibernate 的 sql 生成和緩存策略。
在 hql 中一些關鍵字比如 select ,from 和 where 等,是不區分大小寫的,但是一些屬性比如表名和列名是區分大小寫的。
from 語句
如果你想要在存儲中加載一個完整并持久的對象,你將使用 from 語句。以下是 from 語句的一些簡單的語法:
string hql = "from employee"; query query = session.createquery(hql); list results = query.list();
如果你需要在 hql 中完全限定類名,只需要指定包和類名,如下:
string hql = "from com.hibernatebook.criteria.employee"; query query = session.createquery(hql); list results = query.list();
as 語句
在 hql 中 as 語句能夠用來給你的類分配別名,尤其是在長查詢的情況下。例如,我們之前的例子,可以用如下方式展示:
string hql = "from employee as e"; query query = session.createquery(hql); list results = query.list();
關鍵字 as 是可選擇的并且你也可以在類名后直接指定一個別名,如下:
string hql = "from employee e"; query query = session.createquery(hql); list results = query.list();
select 語句
select 語句比 from 語句提供了更多的對結果集的控制。如果你只想得到對象的幾個屬性而不是整個對象你需要使用 select 語句。下面是一個 select 語句的簡單語法示例,這個例子是為了得到 employee 對象的 first_name 字段:
string hql = "select e.firstname from employee e"; query query = session.createquery(hql); list results = query.list();
值得注意的是 employee.firstname 是 employee 對象的屬性,而不是一個 employee 表的字段。
where 語句
如果你想要精確地從數據庫存儲中返回特定對象,你需要使用 where 語句。下面是 where 語句的簡單語法例子:
string hql = "from employee e where e.id = 10"; query query = session.createquery(hql); list results = query.list();
order by 語句
為了給 hsq 查詢結果進行排序,你將需要使用 order by 語句。你能利用任意一個屬性給你的結果進行排序,包括升序或降序排序。下面是一個使用 order by 語句的簡單示例:
string hql = "from employee e where e.id > 10 order by e.salary desc"; query query = session.createquery(hql); list results = query.list();
如果你想要給多個屬性進行排序,你只需要在 order by 語句后面添加你要進行排序的屬性即可,并且用逗號進行分割:
string hql = "from employee e where e.id > 10 " + "order by e.firstname desc, e.salary desc "; query query = session.createquery(hql); list results = query.list();
group by 語句
這一語句允許 hibernate 將信息從數據庫中提取出來,并且基于某種屬性的值將信息進行編組,通常而言,該語句會使用得到的結果來包含一個聚合值。下面是一個簡單的使用 group by 語句的語法:
string hql = "select sum(e.salary), e.firtname from employee e " + "group by e.firstname"; query query = session.createquery(hql); list results = query.list();
使用命名參數
hibernate 的 hql 查詢功能支持命名參數。這使得 hql 查詢功能既能接受來自用戶的簡單輸入,又無需防御 sql 注入攻擊。下面是使用命名參數的簡單的語法:
string hql = "from employee e where e.id = :employee_id"; query query = session.createquery(hql); query.setparameter("employee_id",10); list results = query.list();
update 語句
hql hibernate 3 較 hql hibernate 2,新增了批量更新功能和選擇性刪除工作的功能。查詢接口包含一個 executeupdate() 方法,可以執行 hql 的 update 或 delete 語句。
update 語句能夠更新一個或多個對象的一個或多個屬性。下面是使用 update 語句的簡單的語法:
string hql = "update employee set salary = :salary " + "where id = :employee_id"; query query = session.createquery(hql); query.setparameter("salary", 1000); query.setparameter("employee_id", 10); int result = query.executeupdate(); system.out.println("rows affected: " + result);
delete 語句
delete 語句可以用來刪除一個或多個對象。以下是使用 delete 語句的簡單語法:
string hql = "delete from employee " + "where id = :employee_id"; query query = session.createquery(hql); query.setparameter("employee_id", 10); int result = query.executeupdate(); system.out.println("rows affected: " + result);
insert 語句
hql 只有當記錄從一個對象插入到另一個對象時才支持 insert into 語句。下面是使用 insert into 語句的簡單的語法:
string hql = "insert into employee(firstname, lastname, salary)" + "select firstname, lastname, salary from old_employee"; query query = session.createquery(hql); int result = query.executeupdate(); system.out.println("rows affected: " + result);
聚合方法
hql 類似于 sql,支持一系列的聚合方法,它們以同樣的方式在 hql 和 sql 中工作,以下列出了幾種可用方法:
s.n. | 方法 | 描述 |
---|---|---|
1 | avg(property name) | 屬性的平均值 |
2 | count(property name or `*`) | 屬性在結果中出現的次數 |
3 | max(property name) | 屬性值的最大值 |
4 | min(property name) | 屬性值的最小值 |
5 | sum(property name) | 屬性值的總和 |
distinct
關鍵字表示只計算行集中的唯一值。下面的查詢只計算唯一的值:
string hql = "select count(distinct e.firstname) from employee e"; query query = session.createquery(hql); list results = query.list();
使用分頁查詢
以下為兩種分頁查詢界面的方法:
s.n. | 方法&描述 |
---|---|
1 | query setfirstresult(int startposition) 該方法以一個整數表示結果中的第一行,從 0 行開始。 |
2 | query setmaxresults(int maxresult) 這個方法告訴 hibernate 來檢索固定數量,即 maxresults 個對象。 |
使用以上兩種方法,我們可以在我們的 web 或 swing 應用程序中構造一個分頁組件。下面是示例,您可以擴展到每次取 10 行:
string hql = "from employee"; query query = session.createquery(hql); query.setfirstresult(1); query.setmaxresults(10); list results = query.list();