如何在多对多关系中找到具有单一角色的用户?
how to find users with a single role in a many to many relationship?
假设我有两个 classes 用户和角色以及一个复合 class 用户角色。
这是一个多对多的关系。对于 groovy,我想计算具有唯一角色 USER_ROLE 的用户总数。我该怎么做?
class User{
String name
}
class Role{
String authority
}
class UserRole{
User user
Role role
}
我只放了相关信息。
我想形成一个 gorm 查询,例如
def result = UserRole.createCriteria().list(){
eq('role', Role.get(1)) //the Role with id 1 is USER_ROLE
}
这样我就可以得到具有唯一角色 USER_ROLE 的用户数。感谢您的帮助!谢谢!
通过对联接建模 table(这是您的复合 class)
,将多对多分解为两个一对多关系
class User{
String name
static hasMany = [userRoles:UserRole]
}
class Role{
String authority
static hasMany = [userRoles:UserRole]
}
class UserRole{
static belongsTo = [user:User, role:Role]
}
现在在 UserRole
上触发您的查询:
def result = UserRole.createCriteria().list(){
eq('role', Role.get(1)) //the Role with id 1 is USER_ROLE
}
无需将 hasMany 添加到您的角色和用户域(您可以将 hasMany 从 User 添加到 UserRole,但您不应将 hasMany 从 Role 添加到 UserRole),
这个 HQL 查询应该做你想做的事。
User.executeQuery("\
SELECT u \
FROM User AS u \
WHERE EXISTS ( \
SELECT 1 \
FROM UserRole AS ur_a \
WHERE ur_a.user = u \
AND ur_a.role = :searchRole \
) \
AND NOT EXISTS ( \
SELECT 1 \
FROM UserRole AS ur_b \
WHERE ur_b.user = u \
AND ur_b.role != :searchRole \
) \
", [searchRole: Role.get(1)])
但是这类 Select 通常在数据库上表现不佳。维护功能或者不经常执行都可以。
假设我有两个 classes 用户和角色以及一个复合 class 用户角色。
这是一个多对多的关系。对于 groovy,我想计算具有唯一角色 USER_ROLE 的用户总数。我该怎么做?
class User{
String name
}
class Role{
String authority
}
class UserRole{
User user
Role role
}
我只放了相关信息。
我想形成一个 gorm 查询,例如
def result = UserRole.createCriteria().list(){
eq('role', Role.get(1)) //the Role with id 1 is USER_ROLE
}
这样我就可以得到具有唯一角色 USER_ROLE 的用户数。感谢您的帮助!谢谢!
通过对联接建模 table(这是您的复合 class)
,将多对多分解为两个一对多关系class User{
String name
static hasMany = [userRoles:UserRole]
}
class Role{
String authority
static hasMany = [userRoles:UserRole]
}
class UserRole{
static belongsTo = [user:User, role:Role]
}
现在在 UserRole
上触发您的查询:
def result = UserRole.createCriteria().list(){
eq('role', Role.get(1)) //the Role with id 1 is USER_ROLE
}
无需将 hasMany 添加到您的角色和用户域(您可以将 hasMany 从 User 添加到 UserRole,但您不应将 hasMany 从 Role 添加到 UserRole), 这个 HQL 查询应该做你想做的事。
User.executeQuery("\
SELECT u \
FROM User AS u \
WHERE EXISTS ( \
SELECT 1 \
FROM UserRole AS ur_a \
WHERE ur_a.user = u \
AND ur_a.role = :searchRole \
) \
AND NOT EXISTS ( \
SELECT 1 \
FROM UserRole AS ur_b \
WHERE ur_b.user = u \
AND ur_b.role != :searchRole \
) \
", [searchRole: Role.get(1)])
但是这类 Select 通常在数据库上表现不佳。维护功能或者不经常执行都可以。