2015-06-19 66 views
1

在閱讀有關GORM Gotchas的信息時,我對於渴望獲取一對一的東西感到困惑。儘管它是在上述環節中指出:Grails:一對多的渴望提取

考慮這個查詢:

Author.list(max: 2, fetch: [ books: 'join' ])

在所有的可能性,這將返回只有一個作者實例。這可能不是你期望或想要的行爲。那麼發生了什麼?

在引擎蓋下Hibernate正在使用左外部聯接來爲每個作者獲取書籍 。這意味着您將獲得重複的作者實例:與作者關聯的每本作品都有一個 。如果您沒有最大 選項,那麼您將不會看到這些重複項,因爲GORM會將它們刪除 。但麻煩的是,最大選項適用於結果 之前刪除重複項。所以在上面的例子中,休眠 只返回兩個結果,這兩個結果可能有相同的 作者。然後GORM刪除重複項,最終得到一個作者實例 。

上面引用的粗體部分是我的困惑開始的地方。如果它是左外連接,我們不應該得到僅由每個作者完成的書(僅由一位作者書)而不是書那是由多個作者(我們沒有進入左外連接的集合的交集)?或者,這暗示着某些關於可能由不止一位作者通過查詢修飾符處理書籍的情況。

我非常感謝任何澄清。

回答

2

混淆來自您不理解正在使用LEFT JOIN執行的SQL來獲取書籍列表。評論試圖指出的是,通過使用LEFT JOINMAX可以爲您提供意想不到的結果。考慮獲取作者在下列

author 
id, name 
1, Bob 
2, Joe 

book 
id, name 
1, First book 
2, Second book 
3, Third book 
4, Fourth book 

author_books 
author_id, book_id 
1, 1 
1, 2 
1, 3 
2, 4 

該查詢使用LEFT JOIN,它的圖書關聯,以便從數據庫返回的數據是這樣的:

author.id, author.name, book.id, book.name 
1, Bob, 1, First book 
1, Bob, 2, Second book 

這將導致一個作者是但收藏的書籍只包括三本相關書籍中的兩本。這是由於MAX限制應用於SQL語句本身並限制返回的最大行數。

爲什麼這樣指出的原因是因爲你可能期待你最大的兩位作者得到您的列表中,無論相關圖書的數量,但由於獲取模式並非如此,因爲的正在執行的實際SQL。

希望有所幫助。

+0

@JosuaMoore是的,這確實有幫助。感謝您提供這樣一個詳細而有見地的答案。你是完全正確的,這是因爲我缺乏對SQL思想的理解。再次感謝。 –

+0

@AnonymousHuman非常受歡迎。我很高興它有幫助。 –

+0

用你在答案中演示的數據集來嘗試這個練習時,我是否給'list()'方法賦予了'max:2'選項,我得到了預期的結果(意味着2個作者實例)。我沒有跑到我的問題討論的問題(只有一個作者實例返回)。那是因爲它不一定會發生?意味着它可能但不是100%會發生? –