代码之家  ›  专栏  ›  技术社区  ›  Michael Oryl

Grails:查找具有List属性的对象,该列表属性包含具有给定属性值的对象

  •  3
  • Michael Oryl  · 技术社区  · 13 年前

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

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

    User: List<Role> roles
    
    Role: String name
    

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

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

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

    3 回复  |  直到 13 年前
        1
  •  1
  •   ataylor    13 年前

    如果Role是一个单独的域对象,则不能直接执行此操作,因为mongo不支持联接。在mongo中实现这一点的方法通常是在用户对象中嵌入一组角色。因此,如果您这样建模User:

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

    然后,您将能够使用这样的条件或where查询:

    def superusers = User.where { roles.name == 'SUPERUSER' }
    
        2
  •  0
  •   user800014 user800014    13 年前

    在这种情况下,您可以使用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")])
    
        3
  •  0
  •   schmolly159    13 年前

    关于条件查询:

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