十一、Hibernate查詢優化之策略設定
阿新 • • 發佈:2018-12-05
使用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屬性就失效了 |