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 }

person enesness    schedule 11.06.2011    source источник


Ответы (2)


def studs = Student.withCriteria {
  eq('age', 7)
  courses {
    eq('id', 1)
  }
}

Он находится в документе GORM, раздел Criteria/Querying Associations.

person Victor Sergienko    schedule 11.06.2011
comment
Спасибо, это то, что я ищу - person enesness; 12.06.2011

Вы можете использовать динамический поиск:

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])
person Burt Beckwith    schedule 11.06.2011
comment
Привет Берт. У студента нет поля курса, у него есть курсы. Я не могу сделать findByCourse, я могу сделать findByCourses, но я могу сравнивать коллекции. - person enesness; 12.06.2011