Grails: родительский идентификатор пуст, когда перечисленные им объекты - PullRequest
0 голосов
/ 07 июля 2011

Впервые здесь, и впервые в Grails, у меня странная проблема с отношениями один-ко-многим.

Я создаю приложение Grails для предоставления услуг веб-сайту и приложениям для смартфонов.
Я изо всех сил старался создать родительский сервис, который может обрабатывать общие действия (создавать, получать, изменять, перечислять, удалять...) от которого я могу наследовать более конкретные сервисы.

Проблема, с которой я сталкиваюсь, связана с действием списка.Я создаю запрос withCriteria из параметров, которые отправляют мне вызывающие.

У меня есть два домена:

class A {
  static hasMany = [bs:B]
}

class B {
  static belongsTo = [a:A]
}

Мне нужно перечислить объекты класса B, принадлежащие объекту A, мой универсальныйСписок действий генерирует это:

List objects = B.withCriteria() {
  createAlias("A","A")
  eq("A.id", myId)
}

Все работает нормально, но дело в том, что я создал общий метод toJSON (), который создает JSON-ответ из экземпляра домена.Для этого я перебираю список строк, который содержит имя свойств домена, которые я хочу добавить в свой ответ JSON.Затем я получаю к ним доступ следующим образом:

objects[0]."$propertyName"

Если мой объект содержит ссылки на другие объекты, я хочу добавить их идентификаторы в ответе JSON.
Эти идентификаторы могут быть доступны с использованием следующего синтаксиса:

objects[0].aId

Но эта чертова вещь ноль!Если я получу доступ к нему, выполнив:

objects[0].a.id

У меня есть правильный родительский идентификатор!

Я сделал несколько тестов, и если я не фильтрую объекты B по объекту A, то я могу получить доступродительский идентификатор, как я хочу это сделать, то есть:

List objects = B.withCriteria() {}
objects[0].aId

Есть идеи о том, что здесь происходит?
Спасибо.

1 Ответ

0 голосов
/ 07 июля 2011

удалены некоторые вещи из-за ваших правок. Я не уверен, почему вам нужно использовать критерии для этого типа запроса.

def car = new Car()
car.addToWheels(new Wheel())
car.save(flush:true)

def theCar = Car.get(1)
def wheels = car.wheels

OR

def wheels = Wheel.findAllByCar(carInstance).

ИЛИ: (и я не знаю, почему вы захотите)

def carInstance = Car.get(carId)
List wheels = Wheel.withCriteria {
   eq("car", carInstance)
}
assertTrue(wheels[0].car.id == carId)
...