Запрос класса домена Grails - как найти по полям, которые ссылаются на другой класс домена? - PullRequest
5 голосов
/ 16 сентября 2010

Допустим, у меня есть два класса домена:

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

Возможно ли для класса домена найти другие связанные классы домена, используя методы динамического поиска *?Я могу сделать это с помощью namedQueries, но id, скорее, не потому, что я не хочу выписывать их для каждого отношения, которое я имею между классами домена

Ответы [ 2 ]

4 голосов
/ 17 сентября 2010

Похоже, что методы findBy * и findAllBy * работают, если вы извлекаете объект, который вам нужно найти заранее.Похоже, что это должна быть точная (не устарелая?) Ссылка на объект в базе данных, поэтому вы не можете создать новый объект, который «выглядит» как объект, по которому вы хотите найти, на самом деле он должен быть этот объект.

Итак, чтобы найти всех пользователей с ролью "role1":

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
0 голосов
/ 21 мая 2015

User.findAllByRole(role) не работает на модульных тестах. Я верю, что это смутило тебя, Эрин.

Кажется, запрос связывания невозможен при юнит-тестах. Я пробовал это так: User.findAllByRole(role.id), и он работает, хотя не вне модульных тестов.

...