Grails: родительский идентификатор равен нулю, когда в нем перечислены объекты

Впервые здесь и новичок в 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

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


person Allan    schedule 07.07.2011    source источник


Ответы (1)


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

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)
person Gregg    schedule 07.07.2011
comment
Спасибо за ваш ответ, но я просто хотел написать простой пример, на самом деле мои домены уже структурированы так. - person Allan; 07.07.2011
comment
Хорошо, у вас уже есть объект А? Если это так, вы можете сделать что-то вроде def bs = B.findAllByA(aInstance). Я не уверен, почему вам нужно использовать критерии для этого. - person Gregg; 07.07.2011
comment
Я не уверен, что ясно изложил свою проблему, я отредактирую свое сообщение и постараюсь быть более конкретным. - person Allan; 08.07.2011