1. 程式人生 > >十一、Hibernate查詢優化之策略設定

十一、Hibernate查詢優化之策略設定

使用Hibernate查詢一個物件的時候,查詢其關聯物件.應該如何查詢,可以通過配置對映檔案的屬性來設定。
lazy屬性:
解決查詢的時機的問題,是否延遲載入關聯資料,例如下面2條語句:

Customer c1 = (Customer) session.get(Customer.class, 1);
System.out.println(c1.getLinkmans().size());

lazy的預設屬性是true,即執行第一條語句的時候,不會執行sql語句去查詢其關聯的表的資料,它只會查詢當前表的資料,當執行到第二條語句的時候才會執行sql語句去查詢其關聯表的資料.

fetch屬性


用於解決查詢的語句用何種形式來執行,例如select 語句,join語句,子查詢語句等等.

在set標籤上配置策略

lazy和fetch屬性可以配置在set標籤上, 可以在一對多的一方和多對多的任何一方的set標籤上進行設定.
下面介紹下這2個屬性的取值及其含義:

lazy的取值 控制是否延遲查詢關聯物件
true 預設值,延遲
false 不延遲
extra 及其懶惰,只查詢關聯條件的內容,關聯物件的其他欄位不查詢,只有單獨用到這些欄位才會再次查詢
fetch的取值 控制SQL語句生成的格式
select 預設值,傳送select查詢語句
join 連線查詢.傳送的是一條迫切左外連線,如果配置了join,那麼lazy屬性就失效了
subselect 子查詢.傳送一條子查詢查詢其關聯物件.(需要使用list()方法進行測試)

Hibernate框架都採用了預設值,開發中基本上使用的都是預設值。特殊的情況按需求而定。

在man-to-one標籤上配置策略

<many-to-one>標籤上使用fetch和lazy屬性只會出現在一對多的多方對映檔案中。具體取值和含義如下:

lazy的取值 控制是否延遲查詢關聯物件
false 不延遲
proxy 預設值,是否延遲是由另一端的<class>上的lazy屬性確定.

說明:如果另一端的<class>上的lazy=”true”,那麼proxy的值就是true(延遲載入);如果另一端的<class>上lazy=”false”,那麼該proxy的值就是false(不採用延遲.)

fetch的取值 控制SQL語句生成的格式
select 預設值,傳送select查詢語句
join 連線查詢.傳送的是一條迫切左外連線,如果配置了join,那麼lazy屬性就失效了