在閱讀有關GORM Gotchas的信息時,我對於渴望獲取一對一的東西感到困惑。儘管它是在上述環節中指出:Grails:一對多的渴望提取
考慮這個查詢:
Author.list(max: 2, fetch: [ books: 'join' ])
在所有的可能性,這將返回只有一個作者實例。這可能不是你期望或想要的行爲。那麼發生了什麼?
在引擎蓋下Hibernate正在使用左外部聯接來爲每個作者獲取書籍 。這意味着您將獲得重複的作者實例:與作者關聯的每本作品都有一個 。如果您沒有最大 選項,那麼您將不會看到這些重複項,因爲GORM會將它們刪除 。但麻煩的是,最大選項適用於結果 之前刪除重複項。所以在上面的例子中,休眠 只返回兩個結果,這兩個結果可能有相同的 作者。然後GORM刪除重複項,最終得到一個作者實例 。
上面引用的粗體部分是我的困惑開始的地方。如果它是左外連接,我們不應該得到僅由每個作者完成的書(僅由一位作者書)而不是書那是由多個作者(我們沒有進入左外連接的集合的交集)?或者,這暗示着某些關於可能由不止一位作者通過查詢修飾符處理書籍的情況。
我非常感謝任何澄清。
@JosuaMoore是的,這確實有幫助。感謝您提供這樣一個詳細而有見地的答案。你是完全正確的,這是因爲我缺乏對SQL思想的理解。再次感謝。 –
@AnonymousHuman非常受歡迎。我很高興它有幫助。 –
用你在答案中演示的數據集來嘗試這個練習時,我是否給'list()'方法賦予了'max:2'選項,我得到了預期的結果(意味着2個作者實例)。我沒有跑到我的問題討論的問題(只有一個作者實例返回)。那是因爲它不一定會發生?意味着它可能但不是100%會發生? –