1. 程式人生 > >Hibernate框架的查詢方式

Hibernate框架的查詢方式

1. 唯一標識OID的檢索方式

* session.get(物件.class,OID)

2. 物件的導航的方式

3. HQL的檢索方式

* Hibernate Query Language        -- Hibernate的查詢語言

4. QBC的檢索方式

* Query By Criteria        -- 條件查詢

5. SQL檢索方式(瞭解)

* 本地的SQL檢索

**技術分析之HQL的查詢方式概述**

1. HQL的介紹

* HQL(Hibernate Query Language) 是面向物件的查詢語言, 它和 SQL 查詢語言有些相似

* 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式

2. HQL與SQL的關係

* HQL 查詢語句是面向物件的,Hibernate負責解析HQL查詢語句, 然後根據物件-關係對映檔案中的對映資訊, 把 HQL 查詢語句翻譯成相應的 SQL 語句.

* HQL 查詢語句中的主體是域模型中的類及類的屬性

* SQL 查詢語句是與關係資料庫繫結在一起的. SQL查詢語句中的主體是資料庫表及表的欄位

***查詢策略***

1. 查詢策略:使用Hibernate查詢一個物件的時候,查詢其關聯物件.應該如何查詢.是Hibernate的一種優化手段!

2. Hibernate框架的檢索策略解決的問題

* 查詢的時機

Customer c1 = (Customer) session.get(Customer.class, 1);

System.out.println(c1.getLinkmans().size());

* lazy屬性解決查詢的時機的問題,需要配置是否採用延遲載入!!

* 查詢的語句形式

List<Customer> list = session.createQuery("from Customer").list();

for(Customer c : list){

System.out.println(c.getLinkmans());

}

* fetch屬性就可以解決查詢語句的形式的問題!

**技術分析之在set標籤上配置策略**

1. 在<set>標籤上使用fetch和lazy屬性

* fetch的取值                                -- 控制SQL語句生成的格式

* select                                   - - 預設值.傳送查詢語句

* join                                        -- 連線查詢.傳送的是一條迫切左外連線!配置了join.lazy就失效了

* subselect                                -- 子查詢.傳送一條子查詢查詢其關聯物件.(需要使用list()方法進行測試)

* lazy的取值                                -- 查詢關聯物件的時候是否採用延遲!

* true                                        -- 預設.延遲

* false                                        -- 不延遲

* extra                                        -- 及其懶惰

2. set標籤上的預設值是fetch="select"和lazy="true"

3. 總結:Hibernate框架都採用了預設值,開發中基本上使用的都是預設值。特殊的情況。

**技術分析之在man-to-one標籤上配置策略**

1. 在<many-to-one>標籤上使用fetch和lazy屬性

* fetch的取值                -- 控制SQL的格式.

* select                         -- 預設。傳送基本select語句查詢

* join                             -- 傳送迫切左外連線查詢

* lazy的取值                 -- 控制載入關聯物件是否採用延遲.

* false                          -- 不採用延遲載入.

* proxy                         -- 預設值.代理.現在是否採用延遲.

* 由另一端的<class>上的lazy確定.如果這端的class上的lazy=”true”.proxy的值就是true(延遲載入).

* 如果class上lazy=”false”.proxy的值就是false(不採用延遲.)

2. 在<many-to-one>標籤上的預設值是fetch="select"和proxy