Jason ---分享,共同進(jìn)步

          激情成就夢(mèng)想,努力創(chuàng)造未來(lái)
          隨筆 - 53, 文章 - 1, 評(píng)論 - 45, 引用 - 0
          數(shù)據(jù)加載中……

          hibernate 一對(duì)多集合 set查詢問(wèn)題

          今天解決了一個(gè)問(wèn)題(如題),這個(gè)問(wèn)題一致沒(méi)有解決,以前的項(xiàng)目中也遇到過(guò)但是都沒(méi)有花時(shí)間去研究,這回徹底的整理了一下。問(wèn)題如:一個(gè)老師類(lèi)(Teacher)和一個(gè)學(xué)生類(lèi)(User),一個(gè)老師有多個(gè)學(xué)生,當(dāng)然這個(gè)例子不夠好,不管怎樣就是這個(gè)意思,老是對(duì)應(yīng)多個(gè)學(xué)生,oneto many

           

                  <set name="users" inverse="true" order-by="column" ><!-- sort="natural"   -->
                      <key>
                          <column name="teacher_id" length="36">
                              <comment>老師表主鍵</comment>
                          </column>
                      </key>
                      <one-to-many class="User" />
                  </set>

           

          以前遇到這個(gè)問(wèn)題,都是通過(guò)lazy=false來(lái)實(shí)現(xiàn),雖然能實(shí)現(xiàn)效果但是效率上會(huì)有問(wèn)題也會(huì)產(chǎn)生N+1的查詢問(wèn)題。

          我一致比較喜歡使用 hibernate的 left join fetch 方式來(lái)抓取結(jié)構(gòu),但是我現(xiàn)在是要在查詢老師的列表中顯示他所有的學(xué)生,如果用 select teacher from Teacher teacher left join fetch teacher.users這樣的方式來(lái)得到學(xué)生集合,這樣老師的數(shù)據(jù)集合會(huì)有重復(fù)數(shù)據(jù),不知我這樣說(shuō)是否理解,如果遇到我這樣的問(wèn)題應(yīng)該比較了解了,使用了很多方法也沒(méi)有通過(guò),當(dāng)然實(shí)現(xiàn)這個(gè)效果可以有別的方式(虛列方式,或這采用 native sql ),我現(xiàn)在就是針對(duì)這種抓取的方式(暫時(shí)還是沒(méi)有找到方案,如果知道的可以告訴我),我現(xiàn)在采用的方式還是上面的抓取方式,出現(xiàn)的重復(fù)數(shù)據(jù),我把結(jié)果集拿出來(lái)之后,把重復(fù)的數(shù)據(jù)過(guò)濾掉,這樣暫時(shí)能解決問(wèn)題。然后是后面的出去的users 排序的問(wèn)題,默認(rèn)我們使用的set set大家都知道是沒(méi)有順序的,我們一種方式是 order-by="column" 上面的,采用這種方式來(lái)實(shí)現(xiàn)排序,另一種方式是采用 sort="natural" 方式來(lái)實(shí)現(xiàn),但是如果要用sort方式就需要實(shí)現(xiàn)compareble 接口 實(shí)現(xiàn) compareTo 方法 來(lái)自定義比較的規(guī)則,第二種方式我試驗(yàn)一下有點(diǎn)問(wèn)題,他們的原理都是通過(guò)這兩個(gè)規(guī)則 指定set最后的實(shí)現(xiàn)類(lèi) 。

          posted on 2011-08-19 17:21 agun 閱讀(2015) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 泽州县| 蕉岭县| 西宁市| 蒙自县| 汪清县| 南昌县| 镇原县| 汉寿县| 陆河县| 苏尼特右旗| 玉林市| 福鼎市| 奎屯市| 德阳市| 宜兴市| 邛崃市| 东光县| 西乡县| 杭锦后旗| 隆昌县| 吐鲁番市| 崇仁县| 玉溪市| 西乡县| 曲沃县| 花垣县| 连南| 呼玛县| 秭归县| 吉木萨尔县| 瓮安县| 漾濞| 昌江| 大理市| 沐川县| 九江县| 宣武区| 南部县| 旌德县| 辽阳县| 永胜县|