超級笨笨

          好腦子,不如一個爛博客
          數(shù)據(jù)加載中……
          Hibernate的fetch="join"和fetch="select"

          fetch參數(shù)指定了關(guān)聯(lián)對象抓取的方式是select查詢還是join查詢,select方式時先查詢返回要查詢的主體對象(列表),再根據(jù)關(guān)聯(lián)外鍵id,每一個對象發(fā)一個select查詢,獲取關(guān)聯(lián)的對象,形成n+1次查詢;
          而join方式,主體對象和關(guān)聯(lián)對象用一句外鍵關(guān)聯(lián)的sql同時查詢出來,不會形成多次查詢。
          如果你的關(guān)聯(lián)對象是延遲加載的,它當(dāng)然不會去查詢關(guān)聯(lián)對象。
          另外,在hql查詢中配置文件中設(shè)置的join方式是不起作用的(而在所有其他查詢方式如get、criteria或再關(guān)聯(lián)獲取等等都是有效的),會使用select方式,除非你在hql中指定join fetch某個關(guān)聯(lián)對象。

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

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

          查詢抓取(默認(rèn)的)在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"/>
          在映射文檔中定義的抓取策略將會有產(chǎn)生以下影響:

          通過get()或load()方法取得數(shù)據(jù)。

          只有在關(guān)聯(lián)之間進(jìn)行導(dǎo)航時,才會隱式的取得數(shù)據(jù)(延遲抓取)。

          條件查詢

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

          通常情況下,我們并不使用映射文檔進(jìn)行抓取策略的定制。更多的是,保持其默認(rèn)值,然后在特定的事務(wù)中, 使用HQL的左連接抓取(left join fetch) 對其進(jìn)行重載。這將通知 Hibernate在第一次查詢中使用外部關(guān)聯(lián)(outer join),直接得到其關(guān)聯(lián)數(shù)據(jù)。 在條件查詢 API中,應(yīng)該調(diào)用 setFetchMode(FetchMode.JOIN)語句。

          其實這并不能說明hql能夠按照配置文件設(shè)置的join進(jìn)行抓取,這時 第二級:topic-->forum 的抓取其實已經(jīng)和hql沒有關(guān)系了,因為前面已經(jīng)產(chǎn)生了另一個select方式的抓取語句。
          而是對象的關(guān)聯(lián)獲取,假如查詢message時topic是設(shè)置為延遲加載的,那么在后面獲取message.topic時,如topic.forum不延遲加載,那么topic-->forum會實現(xiàn)配置的join方式的抓取,這個顯然和hql查詢沒有關(guān)系。

          轉(zhuǎn)載自:http://qinhanbin.javaeye.com/blog/520038

          posted on 2009-12-29 10:15 超級笨笨 閱讀(438) 評論(0)  編輯  收藏 所屬分類: SSH

          主站蜘蛛池模板: 河津市| 星座| 新乡市| 宝鸡市| 岳普湖县| 富源县| 秦皇岛市| 安吉县| 东阿县| 中江县| 铜川市| 奉节县| 乌鲁木齐市| 万年县| 长沙县| 长沙市| 建德市| 友谊县| 临颍县| 德化县| 微博| 丰台区| 雅安市| 仙居县| 双鸭山市| 库车县| 光山县| 虎林市| 始兴县| 高尔夫| 淮阳县| 五指山市| 南宫市| 陈巴尔虎旗| 青铜峡市| 开原市| 天门市| 小金县| 全州县| 邓州市| 禹州市|