1. 程式人生 > >【Hibernate(四)】HQL_QBC查詢詳解——抓取策略優化機制

【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 測試批量抓取