一尘不染

如何在Hibernate中加入两个不同的条件?

hibernate

我的数据库中有三个表,一个学生,一个班级和一个作业。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

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

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来“统一”这两个条件。


阅读 254

收藏
2020-06-20

共1个答案

一尘不染

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

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

DisjunctionConjunction类提供add()分别的方法来施加OR或AND,标准之间。

您的情况:

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

  • Student不上课的人;
  • 一个Conjunction有两个Criterion
    • Student分配给的classe所有物schoolYear "1"
    • Student那些小号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
2020-06-20