У меня есть пара сценариев, в которых я хочу получить один Advertiser
и получить большую часть своего графа объектов. Я определенно не хочу делать это по умолчанию, поэтому я искал правильный способ сделать это для одного запроса. Это то, что я придумал до сих пор:Есть ли более чистый, более Grailsy способ написать этот запрос?
Advertiser.createCriteria().get {
eq('id', id)
createAlias('foos', 'foos', CriteriaSpecification.LEFT_JOIN)
createAlias('foos.bars', 'bars', CriteriaSpecification.LEFT_JOIN)
createAlias('bars.baz', 'bazzes', CriteriaSpecification.INNER_JOIN)
}
Это работает, но я не люблю его по нескольким причинам.
- Похоже, что это очень косвенный и неинтуитивный способ сказать «просто присоединитесь к столам Данг».
- Нет проверки времени компиляции. Если ассоциация
foos
не существовала наAdvertiser
, компилятору все равно.
Вот как я бы очень хотелось видеть, что это работает:
Advertiser.where {
id == id
foos {
bars {
baz
}
}
}
Но это не делает ни присоединения; очевидно, если вы на самом деле не задаете условия для этого свойства (>
, <
, ==
и т. д.), это просто проигнорирует вас.
Какие у меня варианты? Как я могу, как минимум, сделать это более понятным для чтения? В поисках ближайшего к моему идеалу, как я могу получить.
Редактировать
Я пробовал некоторые из предложений ниже, и вещи не работают, и это может быть отчасти потому, что я не получаю мой синтаксис права. Допустим, что мне нужно стремятся принести дополнительная первая ассоциация уровня называется whatsits
Я пытаюсь сделать это следующим образом:
Advertiser.withCriteria {
idEq(id)
whatsits
foos {
bars {
baz
}
}
}
Я также попытался
Advertiser.withCriteria {
idEq(id) && whatsits && foos {
bars {
baz
}
}
}
Но разный подходы дают разные исключения, странные запросы и т. д.
Вопрос использует 1 INNER_JOIN и 2 LEFT_JOINs. FetchMode.JOIN приведет к 3 INNER JOINs. –