Hibernate主要有如下幾種查詢方式:
導航物件圖檢索方式
根據己經載入的物件,導航到其他物件。
OID檢索方式
按照物件的OID來檢索物件。
HQL檢索方式
使用面向物件的HQL查詢語言。
HQL(Hibernate QueryLanguage) 是面向物件的查詢語言,它和SQL查詢語言有些相似。
在Hibernate提供的各種檢索方式中,HQL是使用最廣的一種檢索方式。它具有如下功能:
- 在查詢語句中設定各種查詢條件。
- 支援投影查詢,即僅檢索出物件的部分屬性。
- 支援分頁查詢。
- 支援連線查詢。
- 支援分組查詢,允許使用having和group
by關鍵宇。 - 提供內建聚集函式,如sum()、min()和max()。
- 能夠呼叫使用者定義的SQL函式。
- 支援子查詢,即嵌入式查詢。
- 支援動態繫結引數。
Session類的find()方法與Query 介面都支援HQL 檢索方式。這兩者的區別在於,前者只是執行一些簡單HQL 查詢語句的便捷方法,它不具布動態繫結引數的功能。
使用HQL查詢姓張的客戶
List<?> customers = session.createQuery(
"from Customer as cwhere c.name like '張%'")
.list();
QBC檢索方式
使用QBC(QueryBy Criteria)API來檢索物件。
採用HQL檢索方式時,在應用
QBC API提供了檢索物件的另一種方式,它主要由Criteria 介面、Criterion 介面和Expression 類組成。
支援在執行時動態生成查詢語句。
使用QBL查詢姓張的客戶
List<?> customers = session.createCriteria(Customer.class)
.add(Restrictions.like("name","張%"))
.list();
Hibernate 還提供了QBE ( Query By Example ) 檢索方式,它是QBC的子功能。QBE允許先建立一個物件樣板,然後檢索出所有和這個樣板相同的物件。
Customer template =new Customer();
template.setName("張三");
List<?> customers = session.createCriteria(Customer.class)
.add(Example.create(template)).list();
本地SQL檢索方式
使用本地資料庫的SQL查詢語句。
其中HQL與QBC的區別:
兩者優缺點
比較方面 |
HQL檢索方式 |
QBC檢索方式 |
可讀性 |
和SQL查詢語言比較接近,比較容易讀懂 |
QBC把查詢語句肢解為一組Criterion例項。可讀性差。 |
功能 |
功能最強大,支援各種各樣的查詢。 |
沒有HQL的功能強大,例如不支援報表查詢和子查詢,而且對連線查詢也做了很多限制。 |
查詢語句形式 |
應用程式必須提供基於字串形式的HQL查詢語句。 |
QBC檢索方式封裝了基於字串形式的查詢語句,提供了更加面向物件的介面。 |
何時被解析 |
HQL查詢語句只有在執行時才會被解析 |
OBC在編譯時就能被編譯,因此更加容易排錯 |
可擴充套件性 |
不具有擴充套件性 |
允許使用者擴充套件Criterion介面 |
對動態查詢語句的支援 |
儘管支援生成動態查詢語句,但是程式設計很麻煩 |
適合於生成動態查詢語句 |
連線查詢的支援
指定的連線查詢型別 |
HQL語法 |
QBC語法 |
適用範圍 |
內連線 |
inner join或者join |
Criteria.createAlias() |
適用於有關聯關係的持久化類,並且在對映檔案中對這種關聯關係作了對映。 |
迫切內連線 |
inner join fetch或者join fetch |
不支援 |
|
隱式內連線 |
不支援 |
||
左外連線 |
left outer join或者left join |
不支援 |
|
迫切左外連線 |
left outer join fetch或者left join fetch |
FetchMode.EAGER |
|
右外連線 |
right outer join或者right join |
不支援 |
|
交叉連線 |
ClassA,ClassB |
不支援 |
適用於 |