2012-02-28 69 views
0

好吧,我是新来的Grails,以及休眠。我简单地描述了一些东西,并且坚持通过联接来查询最简单的多对多关系。Grails/GORM简单的多对多连接查询不起作用?

我的模型对象:

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或角色=一些角色实例等等。我没有想法。有什么帮助吗?

顺便说一句,数据库是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> 
+0

我看到与运行'grails shell'相同的行为,但你的例子和t他在运行'grails console'时将答案中的示例标准运行良好。所以我认为这是一个壳问题。由于基于Swing的控制台非常易于使用,因此它的维护状况不佳。 – 2012-02-28 18:46:54

+1

你有GOT在开玩笑吧!我发现很难相信shell会影响ORM的行为方式,但是它确实存在。 伯特,请添加您的评论作为答案,所以我可以接受它(嗯,我接受你说的话,不确定我接受,这就是Grails是如何!)非常感谢。 – smendola 2012-02-28 20:17:25

回答

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

尝试使用标准

+0

谢谢;虽然没有这样做,请参阅编辑至OP。 – smendola 2012-02-28 17:10:51

0

,如果你愿意使用一个标准查询,而不是这应该工作:

String roleName = 'Admin' 

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

谢谢;虽然没有这样做,请参阅编辑至OP。 – smendola 2012-02-28 17:09:54