通过匹配搜索列表的字符串在Grails / HQL中进行搜索和排序

时间:2013-09-06 00:44:06

标签: hibernate grails hql

我有一类学生

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']。在这种情况下,结果应按搜索列表中有多少学生在该班级中排序:

  1. 数学 - 所有3个都在那个班级
  2. 体育 - 搜索列表的2名学生参加体育课
  3. 物理学 - 1名学生在物理课上
  4. 经济学课程不能归还,因为搜索列表中的学生不在该课程中。

    我阅读Hibernate Documentation上的整个文档,我认为'some'和'elements'可以帮助我,但我的问题是排序和搜索词的数量可变。

1 个答案:

答案 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']])