Hibernate Grails域类查询-如何通过链接到另一个域类的字段查找?

Hibernate Grails域类查询-如何通过链接到另一个域类的字段查找?,hibernate,grails,groovy,gorm,Hibernate,Grails,Groovy,Gorm,假设我有两个域类: class User { String name Role role } class Role { String name static belongsTo = [user: User] } 我创建了一些记录: def r1 = new Role(name: "role1").save() def r2 = new Role(name: "role2").save() new User(name: "user1", role: r1).save() new

假设我有两个域类:

class User {
  String name
  Role role
}

class Role {
  String name
  static belongsTo = [user: User]
}
我创建了一些记录:

def r1 = new Role(name: "role1").save()
def r2 = new Role(name: "role2").save()
new User(name: "user1", role: r1).save()
new User(name: "user2", role: r2).save()
new User(name: "user3", role: r1).save()
我现在如何按角色选择我的用户?我希望能够做到以下一点:

def role = Role.findByName("role1"); //returns a Role with [ id:1 name:"role1" ]
User.findAllByRole(role) //returns null
User.findAllByRole(new Role(name: "role1")) //returns null
User.findAllByRole(role.id) //returns null
User.findAllByRole(id: role.id) //returns null

域类是否可以使用dynamic find*方法查找其他关联的域类?我可以使用namedQueries来实现,但我不是因为我不想为域类之间的每一个关系都写出它们,如果您检索需要事先查找的对象,findBy*和findAllBy*方法似乎确实有效。看起来它必须是对数据库中某个对象的精确(非陈旧?)引用,因此您不能创建一个“看起来”像您要查找的对象的新对象,它实际上必须是该对象

因此,为了找到所有具有“角色1”角色的用户:

User.findAllByRole(角色)
在单元测试中不起作用。我相信这就是你困惑的地方,艾琳


在单元测试下,查询关联似乎是不可能的。我曾经这样尝试过:
User.findAllByRole(role.id)
,虽然它在单元测试之外不起作用,但它仍然有效。

事实上,我似乎是个白痴。findAllByRole(角色)现在可以工作了什么不起作用?如果问题不那么简单,您可以为自己的问题编写一个答案并接受它,以便将来有相同问题的人可以从中得到帮助。仅供参考:您问题中的代码是使用查找检索角色。这不仅仅是用相同的数据创建一个。我认为不需要def-in(def-user-in-users)。对于(用户中的用户){}应该可以。我认为您的答案与您的问题相冲突。在您的问题中,您有以下内容:def role=role.findByName(“role1”)//返回一个具有[id:1 name:“role1”]User.findAllByRole(Role)//的角色返回null为什么返回null?您没有在此处创建新对象。我想这就是@JavidJamae所说的。哈哈5年后。。。我很久以前就放弃了圣杯。当时,它是膨胀的,令人难以置信的缓慢和一个噩梦的发展。现在可能更好了,我不知道。最近在.NET工作了一段时间后,我一直倾向于纯春天。很抱歉打扰您。我也遇到了同样的问题,这个帖子是我在谷歌搜索时最热门的,所以我觉得我应该给它添加一些东西。我非常喜欢Grails(来自Java+Spring+Hibernate)。哦,我对你的答案没有问题,它为知识库做出了贡献,这真是太棒了。感谢您花时间发布!
def role = Role.findByName("role1")
def users = User.findAllByRole(role)
for (def user in users) {
 println("User ${user.name} matched the query, with role: ${user.role.name}")
}
//prints:
//User user1 matched the query, with role role1
//User user3 matched the query, with role role1