我有一类学生
class StudentClass {
String name
static hasMany = [students: Student]
}
和学生
class Student {
String name
}
学生可以在他想要的任意数量的课程中。
如何根据学生姓名列表编写查询,例如['汤姆','安琪莉卡','蒂米'] 这给了我一个列表,列出了学生列出搜索列表中每个学生的所有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个studen类在数据库中是持久的。
现在我想查询至少包含列表中给出的学生的所有学生班级。该搜索列表可以是例如包含['Tom','Angelika','Timmy']。在这种情况下,结果应按搜索列表中有多少学生在该班级中排序:
经济学课程不能归还,因为搜索列表中的学生不在该课程中。
我阅读Hibernate Documentation上的整个文档,我认为'some'和'elements'可以帮助我,但我的问题是排序和搜索词的数量可变。
答案 0 :(得分: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']])