如何在多对多关系中找到具有单一角色的用户?

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 通常在数据库上表现不佳。维护功能或者不经常执行都可以。