我的 Grails 应用程序使用 Spring Security 并具有通常User
的UserRole
、 和Role
类。这些类的建模方式很少见,因为在或中都没有hasMany
映射。相反,这些类仅通过.User
Role
UserRole
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
,所以如果有人可以让我明白这一点,我将不胜感激。