WEB開發(7) Hibernate篇(下) HQL語言
HQL查詢語言
Hibernate查詢語言為Hibernate Query Language。
HQL概述
- 有SQL中的select、from、order by、count()、where等關鍵字。
- 但是跟的不是表名,而是實體類名,也可以是實體類物件的屬性或其他值。
- 簡化寫法“ from Cat ",將會在當前持久化的容器中查詢所有的Cat實體類物件。
- 此外,對關鍵字大小寫不敏感,但是對類名、包名、屬性名必須大小寫一致。
區分不同類要加上包名
返回型別
HQL查詢單個物件
Number是所有常用資料型別的父類,能夠使用相應的方法進行轉換。
HQL返回集合屬性
第二個查詢體現了HQL的面向物件類的強大功能,能夠把類中的屬性查詢出來。
同時返回多個物件
查詢部分屬性,每一條資料可以存放在(一個Object[]陣列 or 一個List or Map)裡,這些個查詢的資料總共又構成了一個List。
Object[]陣列的
List型別的
Map型別的
直接返回實體物件也可以,即使只取部分的屬性。
條件查詢
用" : variable "的方式留下引數,然後再setParameter中逐一去配置。
HQL支援的運算子和SQL基本類似
一些關鍵字的例子
查詢條件用傳參的方法setParameter()分開寫,能夠提高HQL執行效率
統計函式
返回值的型別是不確定的,需要用Number類來進行轉換。
HQL分頁顯示
注意,setMaxResults(10)是取10條資料出來的意思。
跨表查詢
如果當前實體類中有另外一個實體類的物件,直接用dot點呼叫就能實現跨表。
級聯查詢
使用SQL資料庫
使用SQLQuery
直接執行SQL語句
返回實體型別
直接用SQL的話需要設定相應的實體類,便於輸出
命名常用查詢
1)@配置命名查詢
@NameQuery用於HQL,@NameNativeQuery用於SQL
設定查詢拓展
知道一下可以拓展功能就行了
設定多個命名查詢
// 硬敲HQL程式碼查詢
List<Post> list = session
.createQuery("select p from Post p left join fetch "
+ "p.tags t where t.name = :name")
.setParameter("name", "Humor").list();
// 用配置命名查詢
List<Post> list = session
.getNamedQuery("postByTag") //注意這一行用getNameQuery()
.setParameter("name", "Humor").list();
優點:
a. 命名查詢(named query)在會話工廠初始化的時候就被初始化了,能夠很快排查bug
b. 命名查詢提供了顯著的編碼效率
缺點:
a. 無法在執行時定製化,因此不能適應動態的查詢
b. 因為是靜態的,如果更改這些查詢的話需要重新啟動載入SessionFactory
*** 簡單來說就是給HQL語句起外號,省得經常用到查詢還得敲HQL。
2)XML配置命名查詢
Hibernate貢獻:面向物件化地對資料庫進行處理。