Как выполнить глубокий запрос в Grails с использованием createCriteria - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть несколько классов домена Grails, между которыми есть отношения, например ...

Domain A {
    ...
    Domain B
}

Domain B {
    ...
    Domain C
}

Domain C {
    ...
    String name
    String attr1
    String attr2
}

Как я могу использовать withCriteria, чтобы выполнить активную выборку на A так, чтобы экземпляры B and C, связанные с A, были включены в мои результаты вот так ...

List<A> aList = [..., B: [..., C: [... name: 'name', attr1: 'attr1', attr2: 'attr2']]]

1 Ответ

0 голосов
/ 01 мая 2018

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

List<A> aList = [..., B: [..., C: [... name: 'name', attr1: 'attr1', attr2: 'attr2']]]

Объявленный тип aList предполагает, что вы хотите List<A>, но отображаемое вами значение выглядит как Map с некоторыми вложенными Map s.

Если вы выполните такой запрос ...

def aList = A.withCriteria {
    // your criteria goes here
}

То, что возвращается из этого, будет List из A, и каждый A будет ссылаться на B, а каждый B будет ссылаться на C.

def aList = A.withCriteria {
    // your criteria goes here
}

for(A obj : aList) {
    B b = obj.b
    C c = b.c

    // ...
}

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ НА ОСНОВЕ КОММЕНТАРИИ:

Неясно, хотите ли вы, чтобы их всегда охотно доставали, или если вы хотите выразить это при выражении запроса. Звучит так, как будто вы хотите выразить это, когда выражаете запрос, что можно сделать следующим образом ...

    import import org.hibernate.FetchMode

    // ...

    A.withCriteria {
        // criteria goes here

        fetchMode "b", FetchMode.JOIN
        fetchMode "b.c", FetchMode.JOIN
    }
...