複製鏈接
請複製以下鏈接發送給好友

hql

鎖定
HQL是Hibernate Query Language(Hibernate 查詢語言)的縮寫,提供更加豐富靈活、更為強大的查詢能力;HQL更接近SQL語句查詢語法。
Hibernate 查詢語言(HQL)是一種面向對象的查詢語言,類似於 SQL,但不是去對錶和列進行操作,而是面向對象和它們的屬性。 HQL 查詢被 Hibernate 翻譯為傳統的 SQL 查詢從而對數據庫進行操作。
中文名
Hibernate 查詢語言
外文名
Hibernate Query Language
縮    寫
hql
特    點
對查詢條件進行了面向對象封裝
接    近
SQL語句查詢語法

hqlHQL的優點

Hibernate查詢語言(HQL)與SQL(結構化查詢語言)相同,但不依賴於數據庫表。 我們在HQL中使用類名,而不是表名,它是數據庫獨立的查詢語言。HQL有很多優點:
  • 數據庫獨立
  • 支持多態查詢
  • 易於Java程序員學習

hqlHQL查詢的步驟

執行HQL查詢的步驟:
1、獲得HibernateSession對象
2、編寫HQL語句
3、調用Session的createQuery方法創建查詢對象
4、如果HQL語句包含參數,則調用Query的setXxx方法為參數賦值
5、調用Query對象的list等方法返回查詢結果。
例如
private void query(){
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        //以HQL語句創建Query對象,執行setString方法為HQL語句的參數賦值
        //Query調用list方法訪問查詢的全部實例
        List list = session.createQuery("select distinct p from Person p where p.name=:name")
                   .setString("name", "chenssy").list();

        //遍歷查詢結果
        for (Iterator iterator = list.iterator();iterator.hasNext();) {
            Person p = (Person) iterator.next();
            System.out.println("id="+p.getId()+",age="+p.getAge());
        }
        session.close();
    }
上面的程序先編寫HQL語句後,使用Session的createQuery(hql)方法創建一個Query,Query對象使用setXxx方法為HQL語句的參數賦值,最後調用list()方法返回查詢的全部結果。
在這裏Query對象可以連續多次調用setXxx方法為HQL參數賦值。這是因為HibernateQuery的setXxx方法的返回值為Query本身,因此程序創建Query後,可以直接多次調用setXxx方法為HQL語句的參數賦值。
Query對象還包含如下兩個方法:
setFirstResult(intfirstResult):設置返回的結果集從第幾條記錄開始。
setMaxResult(intmaxResult):設置本次查詢返回的結果數目。
這兩個方法用於對HQL查詢實現分頁控制 [1] 

hqlHQL查詢的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();

hqlHQL查詢的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();

hqlHQL查詢的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 表的字段。

hqlHQL查詢的WHERE 語句

如果你想要精確地從數據庫存儲中返回特定對象,你需要使用 WHERE 語句。下面是 WHERE 語句的簡單語法例子:
String hql = "FROM Employee E WHERE E.id = 10";Query query = session.createQuery(hql);List results = query.list();

hqlHQL查詢的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();

hqlHQL查詢的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();

hql使用命名參數

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();
參考資料
  • 1.    陳省. 面向對象的NHibernate數據查詢語言[J]. 電腦編程技巧與維護, 2004(12):42-46.