如何在Hibernate下加入两个不同的标准?

Sim*_* L. 5 hibernate java-ee

我的数据库中有三个表,一个学生,一个Classe和一个Assignement.POJO如下:

Student{
    Classe currentClasse;
    Set<Assignement> assignements;
}

Classe{
    Set<Assignement> assignements;
    SchoolYear schoolYear;
}

Assignement{
    Classe classe;
    Student student;
    Boolean pass;
}
Run Code Online (Sandbox Code Playgroud)

基本上,学生有一个当前的班级和一个分配清单(他被分配到的所有班级).

我的问题是,在hibernate下,我想知道所有没有classe(is null)OR的学生被分配到属于schoolyear"1"的类但是已经pass设置为true

我设法制作了两个单独的标准来获得我想要的东西:

session.createCriteria(Student.class)
       .add(Restrictions.isNull("classeActuelle"))
Run Code Online (Sandbox Code Playgroud)

和

session.createCriteria(Student.class)
       .createAlias("assignements", "a")
       .add(Restrictions.eq("a.pass", Boolean.TRUE)
       .createAlias("a.classe","c")
       .add(Restrictions.eq("c.schoolYear", "1"))
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将这两个标准"联合"起来或......

acd*_*ior 11

如果要创建包含许多对象的OR表达式Criterion,可以使用的实例org.hibernate.criterion.Disjunction.使用此对象相当于使用多个OR限制,但更方便.要获得一个Disjunction对象,请致电Restrictions.disjunction().

如果需要创建包含许多对象的AND表达式Criterion,可以使用对象org.hibernate.criterion.Conjunction.该Restrictions.conjunction()方法返回一个Conjunction.

的Disjunction和Conjunction类提供add()的方法来施加OR或AND分别的标准之间.

你的情况:

在您的特定情况下,您可以Disjunction使用两个创建外部Criterion:

  • Student谁没有上课;
  • 一个Conjunction有两个Criterion:
    • Student分配给classe属于schoolYear "1";
    • Students已pass设置为true.

示例代码:

以下代码使用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
Run Code Online (Sandbox Code Playgroud)