我有一個擁有多個嵌套關聯的數據庫。基本上,結構如下:熱切地使用nhibernate(和queryover)獲取多個嵌套關聯
Order -> OrderItem -> OrderItemPlaylist -> OrderPlaylistItem -> Track -> Artist
我需要生成基於在一定的日期,這需要遍歷到所有提到的團體,以便生成所需的信息出售的所有訂單報告。
嘗試將所有表連接在一起將會是一個矯枉過正的問題,因爲它會導致與大量冗餘數據的非常大的笛卡爾連接,因爲它會將6個表連接在一起。代碼如下:
q.Left.JoinQueryOver<OrderItem>(order => order.OrderItems)
.Left.JoinQueryOver<OrderItemPlaylist>(orderItem => orderItem.Playlist)
.Left.JoinQueryOver<OrderItemPlaylistItem>(orderItemPlaylist => orderItemPlaylist.PlaylistItems)
.Left.JoinQueryOver<Track>(orderItemPlaylistItem => orderItemPlaylistItem.Track)
.Left.JoinQueryOver<Artist>(track => track.Artist)
上述工作,但即使是幾個訂單,每幾個訂單項,每個由多個音軌的播放列表,結果會爆炸上千個記錄,每個額外的成倍增長訂購。
任何想法什麼是最好和最有效的方法?我目前已經嘗試啓用批量加載,這大大縮減了數據庫查詢的數量,但對我來說似乎並不是一個好方法,但更像是一種「簡單解決方法」。
在給定大量數據的情況下,不需要僅僅在一個SQL查詢中加載所有數據。我猜想每個關聯的一個SQL查詢將是完美的。理想情況下,首先您可以獲得所有訂單,然後獲取訂單的所有訂單項並將其加載到關聯的集合中,然後加載每個訂單項的播放列表,等等。
此外,這不必特別在QueryOver中,因爲我可以訪問.RootCriteria
並使用Criteria API。
任何幫助將不勝感激!
雖然它是相關的,但我真的試着避免使用HQL,因爲我認爲它對於可維護性來說是可怕的 – 2011-09-02 09:31:52