1. 程式人生 > >Hibernate主要有如下幾種查詢方式:

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檢索方式時,在應用

程式中需要定義基於字串形式的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

不支援

適用於