我的数据库中有三个表,一个学生,一个班级和一个作业。POJO如下:
Student{ Classe currentClasse; Set<Assignement> assignements; } Classe{ Set<Assignement> assignements; SchoolYear schoolYear; } Assignement{ Classe classe; Student student; Boolean pass; }
基本上,一个学生有一个当前班级,以及一份作业清单(他被分配到的所有班级)。
我的问题是,在hibernate状态下,我想知道所有没有班级(is null) 或 分配给属于“ 1”学年班级但已pass设置为true
is null
pass
true
我设法制定了两个单独的标准来获得我想要的东西:
session.createCriteria(Student.class) .add(Restrictions.isNull("classeActuelle"))
和
session.createCriteria(Student.class) .createAlias("assignements", "a") .add(Restrictions.eq("a.pass", Boolean.TRUE) .createAlias("a.classe","c") .add(Restrictions.eq("c.schoolYear", "1"))
但是我不知道如何用or来“统一”这两个条件。
如果要创建包含许多对象的 OR 表达式Criterion,可以使用的实例org.hibernate.criterion.Disjunction。使用此对象等效于但比使用多个OR限制更方便。要获取Disjunction对象,请致电Restrictions.disjunction()。
OR
Criterion
org.hibernate.criterion.Disjunction
Disjunction
Restrictions.disjunction()
如果您需要使用多个对象创建 AND 表达式Criterion,则可以使用的对象org.hibernate.criterion.Conjunction。该Restrictions.conjunction()方法返回一个Conjunction。
AND
org.hibernate.criterion.Conjunction
Restrictions.conjunction()
Conjunction
的Disjunction和Conjunction类提供add()分别的方法来施加OR或AND,标准之间。
add()
在您的特定情况下,您可以创建Disjunction具有两个的外部对象Criterion:
Student
classe
schoolYear
"1"
以下代码同时使用Disjunction和Conjunction对象来构造必要的条件。
Criteria c = session.createCriteria(Student.class) .createAlias("assignements", "a") .createAlias("a.classe","c"); Disjunction or = Restrictions.disjunction(); or.add(Restrictions.isNull("classeActuelle")); Conjunction and = Restrictions.conjunction(); and.add(Restrictions.eq("a.pass", Boolean.TRUE) and.add(Restrictions.eq("c.schoolYear", "1")) or.add(and); c.add(or); // you can use your criteria c now