【问题标题】:Grails: Finding objects with List properties containing an object with a given property valueGrails:查找具有列表属性的对象,其中包含具有给定属性值的对象
【发布时间】:2013-02-13 07:31:53
【问题描述】:

我正在开发一个 Grails 应用程序。我们有一个名为 User 的域对象,而 User 的属性之一是 Role 对象列表。角色有几个属性,其中之一是“名称”。

我需要找到在其角色列表属性中具有特定名称的角色的所有用户对象。

User: List<Role> roles

Role: String name

因此,给定一个用户列表,我需要在其角色列表属性中找到名为“SUPERUSER”的角色的所有用户。

后端的数据库是 MongoDB,所以我们不能使用 SQL 查询或类似的东西(应用程序根本不使用 Hibernate)。据我所知,动态查找器和 CriteriaBuilder 解决方案都可以。

任何帮助将不胜感激。我想我忽略了一些明显的事情,因为在我看来这并不应该那么难。至少如果我在写 SQL 就不会。

【问题讨论】:

  • user.roles.contains(Role.findByName("SUPERUSER"))
  • @james 不是这样。我不希望返回关于用户是否包含该角色的布尔值,我想要使用 GORM 包含该角色的用户列表。
  • @tim_yates 我在那里没有看到实际的编辑。
  • 哦,groovy 标签被删除了。我想这是有道理的。
  • 角色是域对象吗?它们是如何映射的?

标签: mongodb grails grails-orm


【解决方案1】:

如果 Role 是一个单独的域对象,则不能直接这样做,因为 mongo 不支持连接。这通常在 mongo 中完成的方式是在用户对象中嵌入角色集合。因此,如果您像这样对 User 建模:

class User {
    List roles
    static embedded = ['roles']
}

然后你就可以像这样使用条件或 where 查询:

def superusers = User.where { roles.name == 'SUPERUSER' }

【讨论】:

  • 是的,Role 是一个域对象。似乎枚举没有正确编组和解组,这就是我们最初计划的方式。我们讨论过嵌入对象。将不得不看看这是否有效。谢谢。
  • 是的,这在将角色属性标记为嵌入后有效。然后我可以使用 superusers.list() 来获取我想要的用户列表。 @schmolly159 还提出了一个标准,这也很有效——只要角色也被嵌入。
  • @MichaelOryl 我们可以使用动态查找器来做同样的事情吗?如果“角色”域类有地址列表怎么办。我们如何获取地址列表?
【解决方案2】:

这种情况下可以使用HQL(未测试,可能需要调整):

def users = User.executeQuery("s from User s inner join UserRole ur on s = ur.user where ur.role = :role", [role: Role.findByName("MYROLE")])

【讨论】:

  • 不,mongo 不支持。这个系统中没有休眠。我将编辑问题以使其更清楚。
  • 我的错,没看到那是 mongo :-)
【解决方案3】:

条件查询呢:

List superUsers = User.withCriteria {
    roles {
        eq('name', 'SUPERUSER')
    }
}

【讨论】:

  • 这会失败,因为使用 mongo 时连接不是 kosher。在按照@ataylor 的建议嵌入角色后,我会再试一次。
  • 在用户中嵌入角色对象后工作。
猜你喜欢
  • 1970-01-01
  • 2015-01-23
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
相关资源
最近更新 更多