hibernate框架學習之數據查詢(HQL)
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)