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 также есть несколько других способов, чтобы выполнить это.