【问题标题】:Grails/GORM simple many-to-many join query not working?Grails/GORM 简单的多对多连接查询不起作用?
【发布时间】:2012-02-28 15:44:07
【问题描述】:

好的,我是 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>

【问题讨论】:

  • 我看到与您运行grails shell 相同的行为,但您的示例和答案中的标准示例在运行grails console 时都可以正常工作。所以我认为这是一个shell问题。由于基于 Swing 的控制台更易于使用,因此维护得不太好。
  • 你一定是在开玩笑吧!我发现很难相信 shell 会影响 ORM 的行为方式,但它确实存在。 Burt,请添加您的评论作为答案,这样我就可以接受(好吧,我接受您所说的,不确定我是否接受 Grails 就是这样!)非常感谢。

标签: grails join many-to-many grails-orm


【解决方案1】:
User.createCriteria().list{
    roles{
        eq('name', 'Admin')
    }
}

尝试使用标准

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多