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語句大小寫敏感,特別是持久化類及其屬性的大小寫。在我們自訂了構造器之後,一定要增加預設構造器。如果你覺得對你有點用的話,請點贊或關注我,謝謝觀看。