程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Hibernate 之HQL數據查詢,hibernatehql

Hibernate 之HQL數據查詢,hibernatehql

編輯:JAVA綜合教程

Hibernate 之HQL數據查詢,hibernatehql


1. HQL簡介

  HQL是面向對象的查詢語言,與SQL查詢語言相比,雖然在語法上類似,都是運行時進行解析,但HQL並不像SQL那樣操作的是數據表,列等數據庫對象,HQL所操作的對象是類,對象,屬性等。它也可以支持繼承和多態等特征,在Hibernate 提供的各種檢索方式中,HQL是使用最廣泛的。

2. Query接口

  Hibernate框架負責解析HQL語句,根據映射配置信息,把HQL查詢語句解析成相應的SQL語句來執行數據庫的查詢操作。這一過程依賴的就是Query接口。Query的實例由Session的createQuery()方法創建,方法中包含一個HQL語句參數。Query接口的list()方法執行HQL查詢,list()方法返回結果為List集合,集合中存放符合查詢條件的持久化對象。

3.檢索對象——from子句

  將兩個實體Commodity(商品)和Seller(商家)設置單向多對一關系,兩者都有相應的數據。用JUnit進行測試。

3.1 輸出商品名稱和所屬商家的名稱

控制台輸出:

  可以看到,第一條語句是查詢商品表獲得所有的商品信息,並輸出第一件商品名稱。接著第二條語句,根據外鍵信息,查詢商家表獲得商品對應商家名稱。接著輸出下一件商品名稱,注意,因為這件商品對應的商家信息也是A服裝店,已經做過相應的查詢,這時就不再做新的查詢,而直接使用已有查詢結果A服裝店。當下面遇到新的商家信息(B數碼店)還沒查詢,同樣根據外鍵信息來查詢商家表。

  這樣的查詢過程,是因為有一個默認的懶加載狀態,Hibernate 默認是不查詢相應的外鍵信息所對應的數據,當需要的時候,才根據具體的需要做一個臨時查詢。這樣的設置也是為了提高查詢的效率和性能。

3.2 from子句中持久化類的引用

  在前面編寫的HQL語句中用了 from Commodity ,它的全限定名為 hbb.Commodity,但我們只需要用他的類名即可。在Java中規定使用類時,一定要指定全限定名,這樣java環境才知道去哪獲取這個類。而HQL語句中之所以可以省略是因為 auto-import(自動引入)缺省情況。在解析HQL語句的時候,會根據映射配置信息自動完成持久化類的導入。當然,在from子句中要使用全限定名也可以。

4. 選擇——select子句

4.1 通過Object[]返回查詢結果

  select子句中未指定返回數據類型,默認為Object[]。

成功執行。如果只查詢一個屬性,依然用Object[]的話,就會報錯,如果只有一個屬性時,list()方法就會返回對象,而不是對象數組,這時需要進行一定調整。

同樣可以直接寫作 List list = query.list();

4.2 通過List返回查詢結果


4.3 通過Map返回查詢結果

  注意get獲取的key值,是字符串類型所以需要加""。如果屬性用了別名,可以把序號改為別名。

 5. 通過自定義類型返回查詢結果

  首先需要在持久化類中定義對應的構造器,構造器的參數就是我們要返回的屬性信息。然後在select子句中調用定義的構造器。以自定義類型返回查詢結果。

 

測試類中:

  注意:當添加了自定義構造器後,在實體類中還需要添加無參構造器,因為在HQL語句中,當指定了查詢目標(如Seller),Hibernate會調用指定構造器(如new Seller())來封裝,但是如果沒有指定構造器,Hibernate便會調用持久化類中默認的構造器,如前面Hql語句“from Seller”就沒有指定構造器,所以要一個無參構造器來完成相應對象的創建。所以當增加了自定義構造器後,添加無參構造器。

6. Orderby子句

  首先對商家的id進行升序排序,如果id相同情況下按照價格做降序排列,如果還一樣則升序排列。

7. 總結

  HQL語句大小寫敏感,特別是持久化類及其屬性的大小寫。在我們自定義了構造器之後,一定要增加默認構造器。如果你覺得對你有點用的話,請點贊或關注我,謝謝觀看。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved