Grails: Как я могу искать детей в отношениях hasMany?

Если у меня есть класс домена клиента, и у этого клиента есть много курсов. Как найти курс, который я ищу? Например:

class Client {
    String name
    static hasMany = [courses:Course]
}

class Course {
    String name
    static belongsTo = [client:Client]
}

def client = Client.get(1)

Я хочу "найти" или "искать" в рамках этих курсов. Может быть, что-то вроде:

client.courses.find(name:'Whatever')

Есть ли способ сделать это с помощью Grails?

Ответы

Ответ 1

Если вы используете кеш второго уровня и настроили его для этой ассоциации, вы можете выполнить итерацию по коллекции (это спасет вас запрос базы данных, если ассоциация находится в кеше).

Вот пример использования умного Groovy API коллекции:

def course = client.courses.find { it.name == "whatever" }

Важно: если вы решите воспользоваться этим подходом, настроить fagercheck/batch fetchching courses, чтобы вы не запускались в проблема n + 1.

Ответ 2

Один способ заключается в использовании методов динамического поиска:

Courses.findAllByClientAndName(client, 'whatever')

Это позволит получить все клиентские курсы под названием "что угодно".

У Grails также есть несколько других способов, чтобы выполнить это.