当前位置: 首页 > 面试题库 >

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

戚建德
2023-03-14
问题内容

我的数据库中有三个表,一个学生,一个班级和一个作业。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来“统一”这两个条件。


问题答案:

如果要创建包含许多对象的 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


 类似资料:
  • 我有dsl查询需要返回 国家所有者是词典列表 地区所有者是词典列表 需要检查id在字典中位置 下面的查询返回,但我需要操作

  • 我有点卡住了。这个问题很接近我需要的,但不完全是: [Products_Final]是订单id上带有订单表的联接表 订单表是 诸如此类 所以如果我这样做了 我想要的是基于不同水果和国家组合的的总数,因为Product_id2看起来可能是重复的顺序。 如果我做了区分,总和似乎不起作用。 我如何把这两件事结合在一起?下面的我也试过了但是接不上

  • 我有3个表格:学生,课程(重要领域点),学生课程(重要领域成绩)。 如果成绩大于或等于70,则考试通过,因此学生将获得分数。如果成绩低于70,学生将不会获得分数。如果学生的学分之和大于10,他就毕业了。 我需要选择学生姓名,他的通过分数的总和,他所有成绩的平均值。我可以选择学生姓名,他的通过分数和他通过成绩的平均数之和。但我需要所有成绩的平均值。 我写了下面的查询。

  • 流程开始如下: 组件1发送请求 API对其进行处理,如果一切正确,则写入组件2 dB 各种数据处理... 组件2发送请求 API对其进行处理,如果一切正确,则写入组件1 dB 我怎么做这件Spring靴呢?我不需要任何域类,因此我认为我不需要使用JPA。

  • 问题内容: 条件:请勿修改原始清单;仅JDK,无外部库。一线或JDK 1.3版本的加分点。 有没有比以下更简单的方法: 问题答案: 你可以使用Apache commons-collections库:

  • 我开始使用flink,看看官方教程之一。 据我所知,这个练习的目标是在时间属性上加入两个流。 任务: 此练习的结果是一个Tuple2记录的数据流,每个记录对应一个不同的rideId。您应该忽略结束事件,只在每次骑乘开始时加入事件,并提供相应的票价数据。 生成的流应打印到标准输出。 问:EnrichmentFunction如何连接这两个流aka。它如何知道参加哪个集市和哪个骑行?我希望它能够缓冲多个