今天解決了一個問題(如題),這個問題一致沒有解決,以前的項目中也遇到過但是都沒有花時間去研究,這回徹底的整理了一下。問題如:一個老師類(Teacher)和一個學(xué)生類(User),一個老師有多個學(xué)生,當(dāng)然這個例子不夠好,不管怎樣就是這個意思,老是對應(yīng)多個學(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>
以前遇到這個問題,都是通過lazy=false來實現(xiàn),雖然能實現(xiàn)效果但是效率上會有問題也會產(chǎn)生N+1的查詢問題。
我一致比較喜歡使用 hibernate的 left join fetch 方式來抓取結(jié)構(gòu),但是我現(xiàn)在是要在查詢老師的列表中顯示他所有的學(xué)生,如果用 select teacher from Teacher teacher left join fetch teacher.users這樣的方式來得到學(xué)生集合,這樣老師的數(shù)據(jù)集合會有重復(fù)數(shù)據(jù),不知我這樣說是否理解,如果遇到我這樣的問題應(yīng)該比較了解了,使用了很多方法也沒有通過,當(dāng)然實現(xiàn)這個效果可以有別的方式(虛列方式,或這采用 native sql ),我現(xiàn)在就是針對這種抓取的方式(暫時還是沒有找到方案,如果知道的可以告訴我),我現(xiàn)在采用的方式還是上面的抓取方式,出現(xiàn)的重復(fù)數(shù)據(jù),我把結(jié)果集拿出來之后,把重復(fù)的數(shù)據(jù)過濾掉,這樣暫時能解決問題。然后是后面的出去的users 排序的問題,默認(rèn)我們使用的set set大家都知道是沒有順序的,我們一種方式是 order-by="column" 上面的,采用這種方式來實現(xiàn)排序,另一種方式是采用 sort="natural" 方式來實現(xiàn),但是如果要用sort方式就需要實現(xiàn)compareble 接口 實現(xiàn) compareTo 方法 來自定義比較的規(guī)則,第二種方式我試驗一下有點問題,他們的原理都是通過這兩個規(guī)則 指定set最后的實現(xiàn)類 。