Grails / GORM简单的多对多连接查询不起作用?

时间:2012-02-28 15:44:07

标签: grails join many-to-many gorm

好的,我是Grails的新手,也是Hibernate的新手。我正在准备一些简单的东西,而且我仍然坚持通过连接来查询最简单的多对多关系。

我的模型对象是:

class User {

    static hasMany = [roles:Role]

    String firstName
    String lastName
    String username
    String password

    // ... constraints and hooks omitted ...

}


class Role {
    static hasMany = [users:User]
    static belongsTo = User

    String name;
    // ... constraints and hooks omitted ...

}

加载一些数据后,我可以看到:

groovy:000> User.list().each { user-> println "$user.username :  ${user.roles.collect {it.name}}"}
smendola :  [Admin, Reviewer]
jripper :  []
jbauer :  []

groovy:000> Role.list().each { role-> println "$role.name: ${role.users?.collect {it.username}}"}
Admin: [smendola]
Guest: null
Reviewer: [smendola]

因此,用户smendola有两个角色;其他用户没有角色;这种关系正在从两个方向发展。好。

现在的问题是: 我想查询具有某种角色的用户。当然,我可以使用上述两个查询之一的返回值并在Groovy中搜索它,但我希望db能够完成这项工作。

我已经为HOURS试图构建一个能够给我想要的结果的查询,但无济于事。我相信我已经将在线示例跟踪到了一个发球台,但我无法让这个查询起作用。

我尝试过的一个版本的查询:

groovy:000> User.where { roles.name == 'Admin' }.list()
===> []

或者这个变种:

groovy:000> User.where { roles {name == 'Admin'}}.list()
===> []

我尝试了许多其他变体,包括使用.id或role = someRoleInstance等。没有任何作用。我没有想法。有任何帮助吗?

顺便说一句,数据库是h2。 Grails版本2.0.0

谢谢!

增加: 提出了两个变体,但也没有用:

groovy:000> User.createCriteria().list{ roles { eq('name', 'Admin') } }
===> []
groovy:000>
groovy:000> roleName = 'Admin'
===> Admin
groovy:000> def users = User.withCriteria {
groovy:001>   roles {
groovy:002>     eq('name', roleName)
groovy:003>   }
groovy:004> }
===> []
groovy:000>

2 个答案:

答案 0 :(得分:0)

User.createCriteria().list{
    roles{
        eq('name', 'Admin')
    }
}

尝试使用标准

答案 1 :(得分:0)

如果您愿意使用条件查询,这应该有效:

String roleName = 'Admin'

def users = User.withCriteria {
  roles {
    eq('name', roleName)
  }
}