【Hibernate(四)】HQL_QBC查詢詳解——抓取策略優化機制
1.2 Hibernate的查詢的方式
Hibernate共提供了五種查詢方式。
1.2.1 Hibernate的查詢方式:OID查詢
OID檢索:Hibernate根據物件的OID(主鍵)進行檢索
1.2.1.1 使用get方法
Customer customer = session.get(Customer.class,1l);
1.2.1.2 使用load方法
Customer customer = session.load(Customer.class,1l);
1.2.2 Hibernate的查詢方式:物件導航檢索
物件導航檢索:Hibernate根據一個已經查詢到的物件,獲得其關聯的物件的一種查詢方式。
LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer = linkMan.getCustomer();
Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();
1.2.3 Hibernate的查詢方式:HQL檢索
HQL查詢:Hibernate Query Language,Hibernate的查詢語言,是一種面向物件的方式的查詢語言,語法類似SQL。通過session.createQuery(),用於接收一個HQL進行查詢方式。
1.2.3.1 初始化一些資料
1.2.3.2 HQL的簡單查詢
1.2.3.3 HQL的別名查詢
1.2.3.4 HQL的排序查詢
1.2.3.5 HQL的條件查詢
1.2.3.6 HQL的投影查詢
投影查詢:查詢物件的某個或某些屬性。
1.2.3.7 HQL的分頁查詢
1.2.3.8 HQL的分組統計查詢
1.2.3.9 HQL的多表查詢
SQL的多表查詢
連線查詢
交叉連線:笛卡爾積 select * from A,B;
內連線 :inner join (inner 可以省略)
隱式內連線:select * from A,B where A.id = B.aid;
顯示內連線:select * from A inner join B on A.id = B.aid;
外連線 :
左外連線:left outer join(outer 可以省略) select * from A left outer join B on A.id= B.aid;
右外連線:right outer join(outer 可以省略) select * from A right outer join B on A.id = B.aid;
子查詢
HQL的多表查詢
連線查詢
交叉連線
內連線
顯示內連線
隱式內連線
迫切內連線
外連線
左外連線
右外連線
迫切左外連線
1.2.4 Hibernate的查詢方式:QBC檢索
QBC查詢:Query By Criteria,條件查詢。是一種更加面向物件化的查詢的方式。
1.2.4.1 簡單查詢
1.2.4.2 排序查詢
1.2.4.3 分頁查詢
1.2.4.4 條件查詢
1.2.4.5 統計查詢
1.2.4.6 離線條件查詢(SSH)---DetachedCriteria
1.2.5 Hibernate的查詢方式:SQL檢索
1.2.5.1 SQL查詢
SQL查詢:通過使用sql語句進行查詢
1.3 Hibernate的抓取策略(優化)
1.3.1 延遲載入
1.3.1.1 什麼是延遲載入
延遲載入:lazy(懶載入)。執行到該行程式碼的時候,不會發送語句去進行查詢,在真正使用這個物件的屬性的時候才會傳送SQL語句進行查詢。
1.3.1.2 延遲載入的分類
類級別的延遲載入
指的是通過load方法查詢某個物件的時候,是否採用延遲。
session.load(Customer.class,1l);
類級別延遲載入通過<class>上的lazy進行配置,如果讓lazy失效
將lazy設定為false
將持久化類使用final修飾
Hibernate. Initialize()
關聯級別的延遲載入
指的是在查詢到某個物件的時候,查詢其關聯的物件的時候,是否採用延遲載入。
Customer customer = session.get(Customer.class,1l);
customer.getLinkMans();----通過客戶獲得聯絡人的時候,聯絡人物件是否採用了延遲載入,稱為是關聯級別的延遲。
抓取策略往往會和關聯級別的延遲載入一起使用,優化語句。
1.3.2 抓取策略
1.3.2.1 抓取策略的概述
通過一個物件抓取到關聯物件需要傳送SQL語句,SQL語句如何傳送,傳送成什麼樣格式通過策略進行配置。
通過<set>或者<many-to-one>上通過fetch屬性進行設定
fetch和這些標籤上的lazy如何設定優化傳送的SQL語句
1.3.2.2 <set>上的fetch和lazy
fetch:抓取策略,控制SQL語句格式
select :預設值,傳送普通的select語句,查詢關聯物件
join :傳送一條迫切左外連線查詢關聯物件
subselect :傳送一條子查詢查詢其關聯物件
lazy:延遲載入,控制查詢關聯物件的時候是否採用延遲
true :預設值,查詢關聯物件的時候,採用延遲載入
false :查詢關聯物件的時候,不採用延遲載入
extra :及其懶惰。
在實際開發中,一般都採用預設值。如果有特殊的需求,可能需要配置join。
1.3.2.3 <many-to-one>上的fetch和lazy
fetch :抓取策略,控制SQL語句格式。
select :預設值,傳送普通的select語句,查詢關聯物件。
join :傳送一條迫切左外連線。
lazy :延遲載入,控制查詢關聯物件的時候是否採用延遲。
proxy :預設值,proxy具體的取值,取決於另一端的<class>上的lazy的值。
false :查詢關聯物件,不採用延遲。
no-proxy :(不會使用)
在實際開發中,一般都採用預設值。如果有特殊的需求,可能需要配置join。
1.3.3 批量抓取
1.3.3.1 什麼是批量抓取
一批關聯物件一起抓取,batch-size
1.3.3.2 測試批量抓取