Hibernate 查詢語言

2021-02-24 15:03 更新

查詢語言

Hibernate 查詢語言(HQL)是一種面向?qū)ο蟮牟樵冋Z言,類似于 SQL,但不是去對表和列進行操作,而是面向?qū)ο蠛退鼈兊膶傩浴?HQL 查詢被 Hibernate 翻譯為傳統(tǒng)的 SQL 查詢從而對數(shù)據(jù)庫進行操作。

盡管你能直接使用本地 SQL 語句,但我還是建議你盡可能的使用 HQL 語句,以避免數(shù)據(jù)庫關于可移植性的麻煩,并且體現(xiàn)了 Hibernate 的 SQL 生成和緩存策略。

在 HQL 中一些關鍵字比如 SELECT ,F(xiàn)ROM 和 WHERE 等,是不區(qū)分大小寫的,但是一些屬性比如表名和列名是區(qū)分大小寫的。

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 語句

如果你想要精確地從數(shù)據(jù)庫存儲中返回特定對象,你需要使用 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 將信息從數(shù)據(jù)庫中提取出來,并且基于某種屬性的值將信息進行編組,通常而言,該語句會使用得到的結果來包含一個聚合值。下面是一個簡單的使用 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();

使用命名參數(shù)

Hibernate 的 HQL 查詢功能支持命名參數(shù)。這使得 HQL 查詢功能既能接受來自用戶的簡單輸入,又無需防御 SQL 注入攻擊。下面是使用命名參數(shù)的簡單的語法:

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() 方法,可以執(zhí)行 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 *) 屬性在結果中出現(xiàn)的次數(shù)
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)
該方法以一個整數(shù)表示結果中的第一行,從 0 行開始。
2 Query setMaxResults(int maxResult)
這個方法告訴 Hibernate 來檢索固定數(shù)量,即 maxResults 個對象。

使用以上兩種方法,我們可以在我們的 web 或 Swing 應用程序中構造一個分頁組件。下面是示例,您可以擴展到每次取 10 行:

String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號