1. 程式人生 > >Hibernate查詢方式與抓取策略(優化)

Hibernate查詢方式與抓取策略(優化)

4. Hibernate查詢方式與抓取策略(優化)


申明:本篇部落格引用黑馬教育;Hibernate其他系列為博主根據黑馬教育整理得到。

上接Hibernate關聯對映(一對多/多對多):https://blog.csdn.net/biggerchong/article/details/84340105


目錄

4. Hibernate查詢方式與抓取策略(優化)

4.1 OID查詢

4.1.1 使用get方法

4.1.2 使用load方法

4.2 物件導航檢索

4.3 HQL檢索

初始化一些資料

HQL的簡單查詢

HQL的別名查詢

HQL的排序查詢

HQL的條件查詢

HQL的投影查詢

HQL的分頁查詢

HQL的分組統計查詢

HQL的多表查詢

4.4 QBC檢索

簡單查詢

排序查詢

分頁查詢

條件查詢

統計查詢

離線條件查詢DetachedCriteria

4.5 SQL檢索

SQL查詢

4.6 Hibernate的抓取策略(優化)

4.6.1 延遲載入的概述

4.6.2 抓取策略

i. 上的fetch和lazy

ii. 上的fetch和lazy

4.6.3 批量抓取


在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的多表查詢

    連線查詢

  1. 交叉連線
  2. 內連線
    1. 顯示內連線
    2. 隱式內連線
    3. 迫切內連線
  3. 外連線
    1. 左外連線
    2. 右外連線
    3. 迫切左外連線

 

迫切內連線/迫切左外連線:迫切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語句進行查詢。

延遲載入的分類

  1. 類級別的延遲載入
    1. 指的是通過load方法查詢某個物件的時候,是否採用延遲。session.load(Customer.class,1l);
    2. 類級別延遲載入通過<class>上的lazy進行配置,如果讓lazy失效
      1. 將lazy設定為false
      2. 將持久化類使用final修飾
      3. Hibernate. Initialize()
  2. 關聯級別的延遲載入
    1. 指的是在查詢到某個物件的時候,查詢其關聯的物件的時候,是否採用延遲載入。

Customer customer = session.get(Customer.class,1l);

customer.getLinkMans();----通過客戶獲得聯絡人的時候,聯絡人物件是否採用了延遲載入,稱為是關聯級別的延遲。抓取策略往往會和關聯級別的延遲載入一起使用,優化語句。

4.6.2 抓取策略

抓取策略的概述

  1. 通過一個物件抓取到關聯物件需要傳送SQL語句,SQL語句如何傳送,傳送成什麼樣格式通過策略進行配置。
    1. 通過<set>或者<many-to-one>上通過fetch屬性進行設定
    2. fetch和這些標籤上的lazy設定優化傳送的SQL語句

i. <set>上的fetch和lazy

  1. fetch:抓取策略,控制SQL語句格式
    1. select                 :預設值,傳送普通的select語句,查詢關聯物件
    2. join                     :傳送一條迫切左外連線查詢關聯物件
    3. subselect          :傳送一條子查詢查詢其關聯物件
  2. lazy:延遲載入,控制查詢關聯物件的時候是否採用延遲
    1. true                    :預設值,查詢關聯物件的時候,採用延遲載入
    2. false                   :查詢關聯物件的時候,不採用延遲載入
    3. extra                  :及其懶惰。
  3. 在實際開發中,一般都採用預設值。如果有特殊的需求,可能需要配置join

ii. <many-to-one>上的fetch和lazy

 

注:當Customer.hbm.xml中的class標籤中lazy=”false”many-to-one上的lazy配置將無效。

  1. fetch :抓取策略,控制SQL語句格式。
    1. select       :預設值,傳送普通的select語句,查詢關聯物件。
    2. join            :傳送一條迫切左外連線。
  2. lazy   :延遲載入,控制查詢關聯物件的時候是否採用延遲。
    1. proxy        :預設值,proxy具體的取值,取決於另一端的<class>上的lazy的值。
    2. false          :查詢關聯物件,不採用延遲。
    3. no-proxy  :(不會使用)
  3. 在實際開發中,一般都採用預設值。如果有特殊的需求,可能需要配置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  

                                                                                                                   -----謝謝閱讀             -----知飛翀