Grails:如何在多对多映射中查询对象?

Posted

技术标签:

【中文标题】Grails:如何在多对多映射中查询对象?【英文标题】:Grails: How to query objects in many to many mapping? 【发布时间】:2011-09-13 02:11:29 【问题描述】:

您好,我有以下域类。

class Student 
   int age
   static hasMany = [courses:Course]


class Course 
   String name
   static hasMany = [students:Student]

我想找到年龄为 7 岁的正在学习课程的学生(id 为 1)。

我可以使用动态查找器或标准生成器或 HQL 来做到这一点吗?

我不想做以下事情,因为它让所有学生都如此低效:

def course = Course.get(1);
course.students.findAll it.age == 7 

【问题讨论】:

【参考方案1】:
def studs = Student.withCriteria 
  eq('age', 7)
  courses 
    eq('id', 1)
  

位于GORM doc,“条件/查询关联”部分。

【讨论】:

谢谢,这就是我要找的【参考方案2】:

您可以使用动态查找器:

def students = Student.findByCourseAndAge(Course.load(1), 7)

通过使用load() 而不是get(),您可以避免检索整个 Course 实例而只需引用其 ID。

另一种选择是 HQL:

def students = Student.executeQuery(
   'from Student s where s.course.id = :courseId and s.age = :age',
   [courseId: 1, age: 7])

【讨论】:

你好,伯特。学生没有“课程”字段,它有“课程”。我不能做 findByCourse,我可以做 findByCourses,但我可以比较集合。

以上是关于Grails:如何在多对多映射中查询对象?的主要内容,如果未能解决你的问题,请参考以下文章

Django - 查询列表中的任何项目在多对多字段中的任何对象

Django ORM:构造查询,该查询将在多对多字段的最后位置的对象中的字段上查找匹配项

如何在多对多关系中更新日期

学说2:在多对多关系中引用连接表

如何在多对多关系中使用带有可编辑字段的 TabularInline?

Sequelize 查询在多对多关系中显示附加数据