【问题标题】:How to join two different criterias under Hibernate?如何在 Hibernate 下加入两个不同的标准?
【发布时间】:2013-06-29 23:19:36
【问题描述】:

我的数据库中有三个表,一个 Student、一个 Classe 和一个 Assignement。 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"))

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

【问题讨论】:

    标签: hibernate jakarta-ee


    【解决方案1】:

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

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

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

    你的情况:

    在您的具体情况下,您可以使用两个Criterion 创建一个外部Disjunction

    • Students 没有课;
    • 一个Conjunction 和两个Criterion
      • Students 分配给属于schoolYear "1"classe
      • pass 设置为trueStudents。

    示例代码:

    以下代码同时使用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
    

    【讨论】:

    • 感谢您的解释和示例代码。当我应用上述标准时,只有“通过”为 TRUE 和“学年”为 1 的学生的结果。我猜这是因为在标准中,我们添加了两个别名和具有“classeActuelle”的学生设置为“null”实际上根本没有分配,因此当我们添加与 Assginement 和 Classe 表的连接时它们不会被选中......有什么方法可以添加 FULL JOIN 吗?
    • 我设法通过将条件更改为:Criteria c=session.createCriteria(Student.class).createAlias("assignements", "a",Criteria.LEFT_JOIN).createAlias("a.classe", "c", Criteria.LEFT_JOIN); 解决了这个问题
    【解决方案2】:

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

    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-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2012-09-20
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多