У меня простая ассоциация "один ко многим":

class Foo {
    int id
    Date someDate

    static hasMany = [
        bars: Bar
    ]
}

class Bar {
    Foo foo
    Date someDate

    static mapping = {
        .....
        columns {
            foo([:]) {
                column name: "id"
            }
        }
    }
}

В нормальных условиях вызов foo.bars вернет все Bars, и это нормально. Но в этом случае мне нужно запросить, используя аргумент someDate. Мне нужно с нетерпением получить коллекцию, но я не знаю, как это сделать. Я бы хотел сделать что-то вроде этого:

Foo.withCriteria {
    eq("id", someId)
    bars {
        eq("someDate", ?????)
    }
}

Я не уверен, что вкладывать в это значение, поскольку это не известно заранее, или есть ли лучший способ сделать это?

0
Alex Beardsley 20 Мар 2013 в 03:17
Вы бы поместили туда переменную ???
 – 
James Kleeh
20 Мар 2013 в 05:33
Думаю, вы упустили вопрос. Я хотел присоединиться к Bars и Foo не только по PK, но и по другому полю Date. Так где же "?????" Я не знал, что туда поставить, чтобы это сделать.
 – 
Alex Beardsley
20 Май 2013 в 21:40

1 ответ

Лучший ответ

Фильтрация списка внутри родительского класса была бы очень запутанной. Если вам удалось создать экземпляр foo, где foo.bars имеет только подмножество списка Bar, такие вещи, как foo.addToBars, будут иметь странное поведение, среди других проблем.

Если вам просто нужно найти набор Bar, принадлежащих данному Foo, отфильтрованных по их свойству someDate, вы должны запросить класс Bar, чтобы начать с участием:

Bar.findAllByFooAndSomeDate(foo, dateVal)
Bar.findAllByFooAndSomeDateBetween(foo, startDate, endDate)

Или же:

Bar.findAll() {
    (foo.id == someId) && (someDate == dateVal)
}

И т.п.

1
codelark 20 Мар 2013 в 22:43
В запросе гораздо больше, я просто сократил его для простоты. Я просто пытаюсь заполнить граф объектов одним запросом (если возможно?) Вместо того, чтобы выполнять несколько запросов для каждого набора, который мне нужно отфильтровать. Я просто хочу получить эту коллекцию на основе свойства someDate родительского объекта. Но ваш комментарий имеет смысл, когда делать что-то со списком было бы странно.
 – 
Alex Beardsley
28 Мар 2013 в 19:20
Если вы заполняете сложный график, вам, вероятно, лучше будет работать с HQL и проекциями.
 – 
codelark
28 Мар 2013 в 19:23