Grails: как запрашивать объекты во многих сопоставлениях?
Здравствуйте, у меня есть следующие классы доменов.
class Student {
int age
static hasMany = [courses:Course]
}
class Course {
String name
static hasMany = [students:Student]
}
Я хочу найти студентов, проходящих курс (с идентификатором 1), с 7 лет.
Могу ли я сделать это с помощью динамического поиска или построения критериев или HQL?
Я не хочу делать следующее, так как это загружает всех студентов настолько неэффективно:
def course = Course.get(1);
course.students.findAll{ it.age == 7 }
2 ответа
Решение
def studs = Student.withCriteria {
eq('age', 7)
courses {
eq('id', 1)
}
}
Это в GORM doc, раздел "Запрос ассоциаций".
Вы можете использовать динамический искатель:
def students = Student.findByCourseAndAge(Course.load(1), 7)
Используя load()
вместо get()
Вы избегаете извлечения всего экземпляра курса и просто ссылаетесь на его идентификатор.
Другой вариант - HQL:
def students = Student.executeQuery(
'from Student s where s.course.id = :courseId and s.age = :age',
[courseId: 1, age: 7])