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