1. 程式人生 > >hibernate框架學習之數據查詢(HQL)

hibernate框架學習之數據查詢(HQL)

-c skill fir 方式 行數據 del 表數據 ber 描述

lHibernate共提供5種查詢方式

?OID數據查詢方式

?HQL數據查詢方式

?QBC數據查詢方式

?本地SQL查詢方式

?OGN數據查詢方式


OID數據查詢方式

l前提:已經獲取到了對象的OID

l查詢:基於OID,使用get/load方法查詢對應的數據

l作用:使用OID獲取對應的數據


HQL數據查詢方式

l前提:已知要進行查詢的數據結構和條件

l查詢:基於Query對象,完成HQL語句的查詢,得 到查詢結果

l作用:基於HQL語法規則,查詢對應的數據


QBC數據查詢方式

l前提:已知要進行查詢的數據結構和條件

l查詢:基於Criteria對象,完成面向對象的查詢,得 到查詢結果

l作用:基於面向對象的規則,查詢對應的數據


本地SQL查詢方式

l前提:已知要進行查詢的數據結構和條件

l查詢:基於SQL語句,完成查詢,得到查詢結果

l作用:基於SQL語法規則,查詢對應的數據


OGN查詢方式

l前提:已經獲取到某個查詢對象(PO)

l查詢:使用已檢索到的對象(PO),導航到其中包含 的其他數據

l作用:使用已加載對象,查詢其中關聯的所有其他 對象數據


HQL查詢方式

lHQL查詢方式是通過HQL語句進行查詢

lHQL(Hibernate Query Language)是一種Hibernate專用的查詢語句,基於面向對象的模式,將SQL語句轉化成對象的操作格式

lHQL查詢方式步驟

?獲取Session對象

?編寫HQL語句(滿足HQL語法規則)

?初始化Query對象(使用Session對象創建,傳入HQL參數)

?初始化Query參數(如果需要)

?執行查詢返回結果(返回單條數據或集合數據)


HQL——簡單查詢

lHQL書寫查詢語句時,如果只進行一張表對應的查詢,且查詢數據為全部數據時,可以使用ORM中的對象名表示表名,查詢內容可以省略

?實際開發中,幾乎不存在上述操作,SQL語句的編寫需要考慮運行效率,通常會為某些屬性添加索引,提高查詢性能

技術分享圖片


HQL——鏈式格式

lHQL書寫時代碼很多,可以通過單條語句完成,這就是HQL查詢的鏈式格式

技術分享圖片

l鏈式格式遠遠強大於上面的形式,在HQL條件查詢和QBC條件查詢時更為強大,但是僅僅是一個格式的變化,無需過於關註。


HQL——獲取數據(返回對象)

l查詢內容:單個屬性或對象

l查詢結果:0到多條數據

l使用Query對象提供的list()完成數據的獲取,獲取後得到一個List集合。List中單條數據封裝的是該數據對應的對象,可以是任意類型

l案例:

?"from TeacherModel"

?返回TeacherModel類的對象

?“select age from StudentModel“

?返回StudentModel類age屬性的對象,該對象類型Integer


HQL——獲取數據(返回對象)

技術分享圖片

技術分享圖片


HQL——使用別名

lHQL書寫過程中,如果類名過長,或者屬性名過長,可以通過別名的方式簡化書寫,同時可以描述查詢的結果為對象類型

l別名使用規則與SQL完全相同,as可以省略

技術分享圖片

l“select tm.nick from TeacherModel tm” (正確)


HQL——獲取數據(返回對象數組)

l查詢內容:多個屬性或對象

l查詢結果:0到多條數據

l使用Query對象提供的list()完成數據的獲取,獲取後得到一個List集合。 List中單條數據封裝的對象數組,該數組中按照先後順序封裝了所有查詢結果

l案例:

?"select teacherName,nick from TeacherModel"

?返回TeacherModel類的teacherName和nick屬性

?“select skill,age from StudentModel“

?返回StudentModel類的skill和age和屬性

技術分享圖片

l查詢的數據內容超過一個,就無法封裝成對象,因此封裝成了一個對象數組,對象數組中的數據數量取決於查詢時要查詢的字段/屬性數量,其中可以使用對象與屬性的格式混用

技術分享圖片

l上述查詢中查詢的第一個數據是屬性,第二個數據是一個對象,這種格式也是被允許的。

l如果查詢的多個數據結果可以包裝成一個對象,可以使用投影技術將其進行封裝,後面詳細解釋。


HQL——獲取數據(返回對象)

l查詢內容:不限

l查詢結果:0到1條數據

l使用Query對象提供的uniqueResult() 完成數據的獲取,獲取後得到一個對象。與list()的區別是本操作只能用於獲取查詢結果為0到1條的數據,如果查詢結果超過1條,程序將拋出查詢結果不唯一異常

l案例:

?"from TeacherModel where uuid = 1"

?返回TeacherModel類的uuid為1的對象,最多一條

luniqueResult方法通常用於執行查詢聚合函數


HQL——聚合函數的使用規則

l聚合函數是SQL語言中提供一種快速進行數據統計操作的內置函數

lHibernate兼容使用SQL語句中的如下聚合函數

?count()

?min()

?max()

?sum()

?avg()

l格式:

?“select count(uuid) from TeacherModel”

技術分享圖片

lcount函數返回的結果必須使用Long型數據接收

技術分享圖片

l其他函數則要根據具體操作的數據類型進行選擇,例如上例中的age需要使用Integer類型接收


HQL——分頁查詢

lHQL查詢中分頁不再交由用戶手工進行,可以使用Query對象提供的方法完成

?setFirstResult(int);

?setMaxResults(int);

l上述兩個方法返回值為原始調用對象Query對象,因此支持鏈式格式

技術分享圖片


HQL——條件查詢

l條件查詢是實際應用中最常見的操作,幾乎不存在不攜帶條件,將全表數據查詢的現象

lHQL條件查詢分為三種格式

?無參數條件查詢

?固定參數查詢

?動態參數條件查詢


HQL——索引格式動態綁定參數

l如果預知傳入的參數類型,使用set類型名稱()完成參數的傳遞(常用)

?查詢所有30歲以上的Java編程人員

技術分享圖片

l使用索引格式傳參,對應的HQL語句中的參數位置發生變化,設置參數代碼仍需維護,不推薦使用。

l在使用參數設定時,參數只能賦值給指定的查詢屬性名稱,如果參數的屬性不是基本數據類型的封裝類,此時需要使用實體進行賦值

?查詢編號為1的老師的所有學生

技術分享圖片

l使用對象遍歷的格式可以完成上述操作

l使用傳遞對象參數的格式完成

?查詢編號為1的老師的所有學生

技術分享圖片

setEntity方法可以完成對象參數的傳遞

setEntity方法要求傳入的參數必須是PO或DO


HQL——名稱格式動態綁定參數

l使用索引的格式匹配參數不夠靈活,維護難度高,HQL還支持定義臨時的變量名稱指定參數(推薦使用)

技術分享圖片

l使用名稱與索引都可以完成對應的功能,傳遞參數時三種參數賦值格式都適用(param,類型,實體)


HQL——條件查詢(鏈式風格)

l條件查詢支持鏈式風格

技術分享圖片

lQuery對象的操作如果返回結果為Query類型,那麽該操作就支持鏈式風格書寫


HQL——投影模式查詢

l普通查詢設置查詢內容

?查詢單個屬性或者對象,則返回對象集合

?查詢多個屬性或對象的組合格式,返回對象數組

l獲取所有學生的姓名和年齡

技術分享圖片

l投影查詢的作用是可以將查詢的數據進行封裝

?將查詢結果封裝成對象

?將查詢結果封裝成集合

l利用構造方法將查詢結果封裝成對象

?要求對應的PO類中提供對應的構造方法

技術分享圖片

?可以為PO類提供各式各樣的構造方法,適應各種各樣的投影

?投影格式較靈活,前提是定義多種構造方法(無參構造方法)


HQL——多表關聯查詢

技術分享圖片

hibernate框架學習之數據查詢(HQL)