Hibernate的fetch=”join”和fetch=”select”

來源:互聯網
上載者:User

fetch參數指定了關聯對象抓取的方式是select查詢還是join查詢,select方式時先查詢返回要查詢的主體對象(列表),再根據關聯外鍵id,每一個對象發一個select查詢,擷取關聯的對象,形成n+1次查詢;
而join方式,主體對象和關聯對象用一句外部索引鍵關聯的sql同時查詢出來,不會形成多次查詢。
如果你的關聯對象是消極式載入的,它當然不會去查詢關聯對象。
另外,在hql查詢中設定檔中設定的join方式是不起作用的(而在所有其他查詢方式如get、criteria或再關聯擷取等等都是有效),會使用select方式,除非你在hql中指定join fetch某個關聯對象。

 

fetch策略用於定義 get/load一個對象時,如何擷取非lazy的對象/集合。 這些參數在Query中無效。

fetch策略用於定義 get/load一個對象時,如何擷取非lazy的對象/集合。 這些參數在Query中無效。

在某種特殊的場合下,fetch在hql中還是起作用的。
例如
現有message(回帖)-->topic(主貼)-->forum(版塊) 的多級many-to-one結構:
第一級:message-->topic many-to-one配置lazy="false" fetch="join"
第二級:topic-->forum many-to-one配置lazy="false" fetch="join"
這時如果"from message",則第二級:topic-->forum中的fetch策略會起作用

 

查詢抓取(預設的)在N+1查詢的情況下是極其脆弱的,因此我們可能會要求在映射文檔中定義使用串連抓取:

 

<set name="permissions"
fetch="join">
<key column="userId"/>
<one-to-many class="Permission"/>
</set
<many-to-one name="mother" class="Cat" fetch="join"/>
在映射文檔中定義的抓取策略將會有產生以下影響:

通過get()或load()方法取得資料。

只有在關聯之間進行導航時,才會隱式的取得資料(延遲抓取)。

條件查詢

在映射文檔中顯式的聲明 串連抓取做為抓取策略並不會影響到隨後的HQL查詢。

通常情況下,我們並不使用映射文檔進行抓取策略的定製。更多的是,保持其預設值,然後在特定的事務中, 使用HQL的左串連抓取(left join fetch) 對其進行重載。這將通知 Hibernate在第一次查詢中使用外部關聯(outer join),直接得到其關聯資料。在條件查詢 API中,應該調用 setFetchMode(FetchMode.JOIN)語句。

其實這並不能說明hql能夠按照設定檔設定的join進行抓取,這時 第二級:topic-->forum 的抓取其實已經和hql沒有關係了,因為前面已經產生了另一個select方式的抓取語句。
而是對象的關聯擷取,假如查詢message時topic是設定為消極式載入的,那麼在後面擷取message.topic時,如topic.forum不消極式載入,那麼topic-->forum會實現配置的join方式的抓取,這個顯然和hql查詢沒有關係。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.