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

时间:2016-09-14 09:28:55

标签: grails gorm

假设我有两个类User和Role以及一个复合类UserRole。

这是一对多关系。使用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的用户数。我感谢任何帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

没有将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通常在数据库上表现不佳。它可以用于维护功能,也可以不经常执行。

答案 1 :(得分:0)

通过对连接表(这是你的复合类)进行建模,将多个关系分成两个一对多的关系

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    
}