我的Grails應用程序使用Spring Security並具有通常的User
,UserRole
和Role
類。這些類的建模方式很少見,因爲User
或Role
中沒有hasMany
映射。相反,這些類僅通過UserRole
引用。Grails N + 1查詢
class UserRole implements Serializable {
User user
Role role
}
我的理解是,該關係已被建模這樣出於性能原因,具體地,以減小N + 1次的查詢的可能性。
在我的應用程序的一部分中,我需要加載所有用戶及其角色。意識到上述問題的,我試圖做這樣的:
def usersByRole = UserRole.createCriteria().list {
fetchMode("user", FetchMode.JOIN)
fetchMode("role", FetchMode.JOIN)
}
然而,當我嘗試訪問User objects
usersByRole.each { it.user }
一個單獨的查詢被頒發給來自User
表中檢索數據,所以我遇到了我試圖避免的問題。我也試過以下,但它遭受同樣的問題。
def usersByRole = UserRole.createCriteria().list {
fetchMode("user", FetchMode.SELECT)
fetchMode("role", FetchMode.SELECT)
}
我應該承認,我不是FetchMode.JOIN
和FetchMode.SELECT
之間的差別完全清楚,因此,如果任何人都可以把我直上,它會受到讚賞。