6

我的数据库中有三个表,一个 Student、一个 Classe 和一个 Assignement。POJO 如下:

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

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

Assignement{
    Classe classe;
    Student student;
    Boolean pass;
}

基本上,一个学生有一个当前班级和一个作业列表(他被分配到的所有班级)。

我的问题是,在休眠状态下,我想知道所有没有班级(is null或被分配到属于学年“1”但已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"))

但我不知道如何将这两个标准与或...“统一”起来

4

2 回答 2

11

如果要创建包含许多对象的OR表达式Criterion,可以使用org.hibernate.criterion.Disjunction. 使用这个对象等同于使用多个 OR 限制,但比使用多个 OR 限制更方便。要获取Disjunction对象,请调用Restrictions.disjunction()

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

DisjunctionandConjunction类提供add()了在条件之间分别应用 OR 或 AND 的方法。

你的情况:

Disjunction在您的特定情况下,您可以创建一个带有两个的外部Criterion

  • Student没有班级的人;
  • 一个Conjunction有两个Criterion
    • Students 分配给一个classe属于schoolYear "1";
    • Students 已pass设置为true

示例代码:

以下代码同时使用DisjunctionConjunction对象来构造必要的条件。

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
于 2013-06-29T23:48:59.763 回答
0

通过细微的更改,它节省了我的时间。谢谢。

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"))


c.add(or);

c.add(and);

// 你现在可以使用你的标准 c

于 2016-08-17T11:02:01.420 回答