这是我的数据库结构:
Foo: //foo class
Set<Students> students;
Set<Teachers> teachers;
//students
Students:
Int id;
String name;
//teachers
Teachers:
Int id;
String name;
Criteria criteria = sess.createCriteria(Foo.class ,"foo").
createAlias("students", "student").
createAlias("teachers","teacher");
//create and statement for the student id
Conjunction andStudent = Restriction.conjunction();
for (Student student : currentFoo.students) {
andStudent.add(Restrictions.eq("student.id", student.id));
}
基本上我想创建一个hibernate查询,其中给出一个Foo列表我想找到与我所比较的Foo中所有学生和老师相匹配的Foos。因此,如果currentFoo具有学生ID 1,3和教师ID 2,4我希望查询返回包含BOTH学生ID 1,3和教师ID 2,4以及其可能包含的任何其他内容的Foos。
运行查询(处理独特结果并删除currentFoo结果)后,我得到0结果...
我确实从currentFoo中删除了一行数据,用于从2行id 1,2到1行1的学生,我得到了结果 - 所以在我看来问题的一部分是第2行的学生在查询期间没有被比较或读入?有人可以帮忙吗?谢谢!
答案 0 :(得分:0)
在这种情况下,您不想使用eq
Criterion
。 in
Criterion
就是您所需要的。将循环替换为构建学生ID集合的循环,然后您可以使用单个(非循环)限制:
andStudent.add(Restrictions.in("student.id", collectionOfStudentIds));
你甚至可以简单地做
andStudent.add(Restrictions.in("student", collectionOfStudents));
但是我有一段时间没有使用它,所以我忘了它是否有效。