0

我有一班学生

class StudentClass {
  String name
  static hasMany = [students: Student]
}

和学生

class Student {
  String name
}

学生可以上任意数量的班级。

我如何根据学生姓名列表编写查询,例如 ['Tom', 'Angelika', 'Timmy'],它为我提供了所有 StudentClass 对象的列表,其中学生列出了搜索列表中存在的每个学生。

提前我真正想做的事情是:获取一个班级列表,其中搜索列表中至少有一个名字在学生列表中,并根据搜索列表中的学生数量对该列表进行排序,这些学生在该列表中。

我在这个问题上坐了很长时间:/我不知道这是否应该通过使用 HQL 来完成。任何建议都会很好

编辑:所以这是一个示例,我想获得以下对象的查询结果作为数据库中保存的以下对象(对于一个更简单的示例,我只使用学生的姓名而不是具有名称属性的学生对象)

StudentClass(name: 'Physics', students: ['Timmy', 'Herbert', 'Christian', 'Martha'])
StudentClass(name: 'Economics', students: ['Franz', 'Paul', 'Joseph'])
StudentClass(name: 'Sports', students: ['Timmy', 'Angelika', 'Christian', 'Jasmine'])
StudentClass(name: 'Math', students: ['Tom', 'Emelie', 'Angelika', 'Timmy'])

这 4 个学生类在数据库中是持久的。

现在我想查询包含至少一个列表中给出的学生的所有学生课程。该搜索列表可以例如包含['Tom'、'Angelika'、'Timmy']。在这种情况下,结果应按搜索列表中实际在该班级的学生人数排序:

  1. 数学 - 他们三个都在那个班
  2. 体育 - 搜索列表中有 2 名学生在体育课
  3. 物理 - 1 名学生在上物理课

经济学课程不能返回,因为搜索列表中的学生都不是该课程的学生。

我阅读了有关Hibernate Documentation的整个文档,我认为“一些”和“元素”在这里可以帮助我,但我的问题是排序和搜索词的数量可变。

4

1 回答 1

0

因此,要获取学生包含给定列表中的学生的班级列表。

连同列表一起,给出给定列表中学生的数量。

StudentClass.executeQuery("select sc.name, count(s) from StudentClass sc join sc.students as s where s in (:students) group by sc.name order by 2 desc",[students: [student1, student2]])

那是你要的吗?

此搜索基于名称而不是对象

StudentClass.executeQuery("select sc.name, count(s) from StudentClass sc join sc.students as s where s.name in (:students) group by sc.name order by 2 desc",[students: ['Tom', 'Angelika']])

如果您不关心从查询中获取计数,您可以执行以下操作:

StudentClass.executeQuery("select sc.name from StudentClass sc join sc.students as s where s.name in (:students) group by sc.name order by count(s) desc",[students: ['Betty', 'Sue']])
于 2013-09-06T12:34:36.283 回答