2015-06-22 8 views
0

Это похоже на основной вопрос, поэтому я предполагаю, что я просто делаю что-то действительно пронзительное. Я пытаюсь перейти большую структуру объектов и хотел бы, чтобы они были с готовностью загружены в конкретном запросе:Запрос критериев 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 {} 
} 
+0

Вы можете прочитать: http://stackoverflow.com/questions/30942895/grails-eager-fetching-of-one-to-manies/ –

+0

Спасибо за ссылку, которая помогает знать, что дубликаты удаляются за кулисами после запроса, хотя это оставляет меня менее уверенным в производительности. Похоже, что использование listDistinct() по критериям дает только один результат, как я бы хотел. – Trebla

ответ

0

Попробуйте указать жадную загрузку в вашем отображении:

class Box { 
    String name 
    hasMany = [marbles:Marble] 

    static mapping = { 
    sort 'name' 
    } 
static fetchMode = [marbles: "eager"] 

} 

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

List boxes = Box.withCriteria() { 
    eq("id", 0) 
} 
+0

Это не работает, так как я хочу, чтобы я не хотел получать эту связь в одном конкретном запросе, а не глобально. – Trebla

+0

В этом случае я сделал бы соединение с мраморами, как вы это делали, и получите 129 результатов и перейдя по полям, добавляющим Карта, например, с отображением окна в список мраморов. Или создайте POJO. – DavidC

Смежные вопросы