Это похоже на основной вопрос, поэтому я предполагаю, что я просто делаю что-то действительно пронзительное. Я пытаюсь перейти большую структуру объектов и хотел бы, чтобы они были с готовностью загружены в конкретном запросе:Запрос критериев Grails возвращает несколько копий одного и того же объекта при активной загрузке
class Box {
String name
hasMany = [marbles:Marble]
static mapping = {
sort 'name'
}
}
и
class Marble {
String name
static belongsTo = Box
}
Так что, если я делаю:
List boxes = Box.withCriteria() {
eq("id", 0)
}
log.info("Boxes returned: ${boxes.size()")
Я вижу, что есть одна коробка, как и ожидалось, если я попытаюсь с удовольствием загрузить мрамор, однако ...
List boxes = Box.withCriteria() {
eq("id", 0)
marbles {}
}
log.info("Boxes returned: ${boxes.size()")
Возвращено 129 коробок (или, точнее, 129 копий одного и того же поля, что верно для «количества мраморов в этом поле»). Кроме того, есть еще два уровня отношений 1: M, которые я бы хотел загрузить здесь ... Что мне нужно сделать, чтобы активно загружать ассоциации и получать только один ящик?
Редактировать: В моем комментарии ниже показано следующее. Я был бы счастлив продолжать другие варианты, но в то же время, «лучший» решение, как представляется:
def c = Box.createCriteria()
c.listDistinct {
eq("id", 0)
marbles {}
}
Вы можете прочитать: http://stackoverflow.com/questions/30942895/grails-eager-fetching-of-one-to-manies/ –
Спасибо за ссылку, которая помогает знать, что дубликаты удаляются за кулисами после запроса, хотя это оставляет меня менее уверенным в производительности. Похоже, что использование listDistinct() по критериям дает только один результат, как я бы хотел. – Trebla