【问题标题】:Criteria Many-to-Many With Custom Join Table Domain具有自定义连接表域的标准多对多
【发布时间】:2011-07-14 19:41:49
【问题描述】:

给出以下示例域:

class UserRole implements Serializable {
  User user
  Role role
}

class User { 
  Set<Role> getRoles() {
    UserRole.findAllByUser(this).collect { it.role } as Set
  } 
}

class Role { 
  Set<User> getUsers() {
    UserRole.findAllByRole(this).collect { it.user } as Set
}

我不知道如何建立标准来查找具有给定角色的所有用户。我尝试了以下方法:

def crit = User.createCriteria()
def results = crit.list {
  roles {
    eq('authority', 'ROLE_ADMIN')
  }
}

但是,它说它在用户中找不到属性“角色”。我需要一个标准的原因是因为在用户中将有其他属性被搜索,因此动态查找器不适用于这种情况。

【问题讨论】:

  • 您打算如何处理结果,您希望它有多大?
  • 我问是因为我想知道是否可以选择查询 UserRole 和 .collect{}ing 用户。
  • 结果会非常小。但是,还有其他关联也需要直接从用户中查询。其他多对多关联,假设它甚至是可能的。

标签: grails many-to-many grails-orm criteria-api


【解决方案1】:

如果您的预期结果很小,那么这样做可能很容易:

def c = UserRole.createCriteria()
def users = c.list {
    role {
        eq('authority', 'ROLE_ADMIN')
    }
    user {
        // additional user property constraints
    }
}.collect { it.user }

如果您期望大量结果,或者您需要翻阅它们,我不确定。我会把它扔在那里,但我从未尝试过。我不知道你是否可以使用projections { property('association') } 并让它工作。

def c = UserRole.createCriteria()
def users = c.list {
    projections {
        property('user') // never tried this, but worth a shot
    }
    role {
        eq('authority', 'ROLE_ADMIN')
    }
    user {
        // additional user property constraints
    }
}

我认为您在示例中尝试执行的操作不会起作用,因为您实际上没有在引用 UserRole 的 User 或 Role 类上定义关系(即带有hasMany)。

【讨论】:

  • 您可以通过将}.collect { it.user } 替换为仅}.user 来稍微缩短第一个,因为结果是一个列表。
  • 我需要}*.user,还是}.user 本身可以工作?我从未见过使用后一种语法。
  • @Burt - 另外,您可能会问:第二个示例中的projection 是否有效?我从来没有尝试过。如果你不知道的话,我会自己设置一个快速测试。
  • 谢谢罗伯。这很有意义。唯一的问题是其他一些搜索条件来自其他多对多关联。例如,用户地址。如果有可能用这个模型建立一个标准。所以就像“userrole == foo && useraddress.city == bar && firstName like doo.”
  • @Rob - 对不起,我在标准查询方面很糟糕 - 我总是使用 HQL。虽然很容易测试:)
猜你喜欢
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2012-06-15
相关资源
最近更新 更多