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

如何在Hibernate下加入两个不同的标准?,hibernate,jakarta-ee,Hibernate,Jakarta Ee,我的数据库中有三个表,一个学生,一个班级和一个作业。POJO如下所示: Student{ Classe currentClasse; Set<Assignement> assignements; } Classe{ Set<Assignement> assignements; SchoolYear schoolYear; } Assignement{ Classe classe; Student student;

我的数据库中有三个表,一个学生,一个班级和一个作业。POJO如下所示:

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

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

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


但我不知道如何用一个或

如果要创建包含多个对象的
表达式,可以使用的实例。使用此对象等同于使用多个或多个限制,但更方便。要获取析取对象,请调用

如果需要使用多个
标准
对象创建
表达式,则可以使用的对象。该方法返回一个
连词

析取
合取
类提供了
add()
方法,分别在条件之间应用OR或and

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
你的情况: 在您的特定情况下,您可以使用两个
标准创建外部
析取

  • 没有上课的学生
    s
  • 带有两个
    标准的
    连词
    • 学生
      被分配到属于
      学年的
      班级
      “1”
    • 学生
      s已将
      通过
      设置为
      true
示例代码: 下面的代码使用
析取
合取
对象来构造必要的条件

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

只需稍作改动,它就节省了我的时间。谢谢

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了

谢谢您的解释和示例代码。当我应用上述标准时,结果显示,只有“及格”的学生为真,“学年”为1。我猜这是因为在标准中,我们添加了两个别名,并且将“classeActuelle”设置为“null”的学生实际上根本没有赋值,因此,当我们添加与Assenginement和Classe表的联接时,他们不会被选中。。。有什么方法可以添加完全联接吗?我通过将条件更改为:
criteriac=session.createCriteria(Student.class).createAlias(“赋值”,“a”,criteria.LEFT\u联接”).createAlias(“a.classe”,“c”,criteria.LEFT\u联接”)
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);