Hibernate查詢方式與抓取策略(優化)
4. Hibernate查詢方式與抓取策略(優化)
申明:本篇部落格引用黑馬教育;Hibernate其他系列為博主根據黑馬教育整理得到。
上接Hibernate關聯對映(一對多/多對多):https://blog.csdn.net/biggerchong/article/details/84340105
目錄
在Hibernate中提供了很多種的查詢的方式。Hibernate共提供了五種查詢方式。
4.1 OID查詢
OID檢索:Hibernate根據物件的OID(主鍵)進行檢索
4.1.1 使用get方法
Customer customer = session.get(Customer.class,1l);
4.1.2 使用load方法
Customer customer = session.load(Customer.class,1l);
4.2 物件導航檢索
物件導航檢索:Hibernate根據一個已經查詢到的物件,獲得其關聯的物件的一種查詢方式。
LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer = linkMan.getCustomer();
Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();
4.3 HQL檢索
HQL查詢:Hibernate Query Language,Hibernate的查詢語言,是一種面向物件的方式的查詢語言,語法類似SQL。通過session.createQuery(),用於接收一個HQL進行查詢方式。
初始化一些資料
HQL的簡單查詢
HQL的別名查詢
HQL的排序查詢
HQL的條件查詢
HQL的投影查詢
投影查詢:查詢物件的某個或某些屬性。
HQL的分頁查詢
HQL的分組統計查詢
HQL的多表查詢
SQL的多表查詢
連線查詢
交叉連線:笛卡爾積
select * from A,B;
內連線 :inner join (inner 可以省略)
隱式內連線:
select * from A,B where A.id = B.id;
顯示內連線:
select * from A inner join B on A.id = B.id;
外連線 :
左外連線:left outer join(outer 可以省略)
select * from A left outer join B on A.id= B.id;
右外連線:right outer join(outer 可以省略)
select * from A right outer join B on A.id = B.id;
子查詢
HQL的多表查詢
連線查詢
- 交叉連線
- 內連線
- 顯示內連線
- 隱式內連線
- 迫切內連線
- 外連線
- 左外連線
- 右外連線
- 迫切左外連線
迫切內連線/迫切左外連線:迫切fetch將連線查詢到的Object的結果集轉換成Customer的結果集。
4.4 QBC檢索
QBC查詢:Query By Criteria,條件查詢。是一種更加面向物件化的查詢的方式。
簡單查詢
排序查詢
分頁查詢
條件查詢
統計查詢
離線條件查詢DetachedCriteria
DetachCriteria查詢適用於多條件查詢(按距離/按訪問量/按好評率等的查詢),DetachCriteria查詢先將條件合併整合起來,然後一起來查詢;這樣避免了一步步查詢造成對查詢效率的削弱。
4.5 SQL檢索
SQL查詢
SQL查詢:通過使用sql語句進行查詢;可以利用sqlQuery.addEntity(具體類.class);將查詢得到的Object集轉換為指定類的集。
4.6 Hibernate的抓取策略(優化)
4.6.1 延遲載入的概述
什麼是延遲載入
延遲載入:lazy(懶載入)。執行到該行程式碼的時候,不會發送語句去進行查詢,在真正使用這個物件的屬性的時候才會傳送SQL語句進行查詢。
延遲載入的分類
- 類級別的延遲載入
- 指的是通過load方法查詢某個物件的時候,是否採用延遲。session.load(Customer.class,1l);
- 類級別延遲載入通過<class>上的lazy進行配置,如果讓lazy失效
- 將lazy設定為false
- 將持久化類使用final修飾
- Hibernate. Initialize()
- 關聯級別的延遲載入
- 指的是在查詢到某個物件的時候,查詢其關聯的物件的時候,是否採用延遲載入。
Customer customer = session.get(Customer.class,1l);
customer.getLinkMans();----通過客戶獲得聯絡人的時候,聯絡人物件是否採用了延遲載入,稱為是關聯級別的延遲。抓取策略往往會和關聯級別的延遲載入一起使用,優化語句。
4.6.2 抓取策略
抓取策略的概述
- 通過一個物件抓取到關聯物件需要傳送SQL語句,SQL語句如何傳送,傳送成什麼樣格式通過策略進行配置。
- 通過<set>或者<many-to-one>上通過fetch屬性進行設定
- fetch和這些標籤上的lazy設定優化傳送的SQL語句
i. <set>上的fetch和lazy
- fetch:抓取策略,控制SQL語句格式
- select :預設值,傳送普通的select語句,查詢關聯物件
- join :傳送一條迫切左外連線查詢關聯物件
- subselect :傳送一條子查詢查詢其關聯物件
- lazy:延遲載入,控制查詢關聯物件的時候是否採用延遲
- true :預設值,查詢關聯物件的時候,採用延遲載入
- false :查詢關聯物件的時候,不採用延遲載入
- extra :及其懶惰。
- 在實際開發中,一般都採用預設值。如果有特殊的需求,可能需要配置join。
ii. <many-to-one>上的fetch和lazy
注:當Customer.hbm.xml中的class標籤中lazy=”false”,many-to-one上的lazy配置將無效。
- fetch :抓取策略,控制SQL語句格式。
- select :預設值,傳送普通的select語句,查詢關聯物件。
- join :傳送一條迫切左外連線。
- lazy :延遲載入,控制查詢關聯物件的時候是否採用延遲。
- proxy :預設值,proxy具體的取值,取決於另一端的<class>上的lazy的值。
- false :查詢關聯物件,不採用延遲。
- no-proxy :(不會使用)
- 在實際開發中,一般都採用預設值。如果有特殊的需求,可能需要配置join。
4.6.3 批量抓取
什麼是批量抓取
一批關聯物件一起抓取,batch-size
通過配置batch-size=”n” 來設定批量抓取的數量(通俗的來說你設定n=3,抓取的時候一次抓3個,如果關聯數為8,共抓取3次---不足3個也能一起抓)
測試批量抓取
Hibernate從入門到深入已經結束,感謝您對Hibernate全套知識的關注!
Hibernate實戰之JavaEE網購整合:https://blog.csdn.net/biggerchong/article/details/84475898
-----謝謝閱讀 -----知飛翀