如何将Hibernate Criteria对象用于多个和/或条件

时间:2011-11-19 13:09:58

标签: hibernate-criteria

我需要创建一个Hibernate标准限制,即3条件。问题是最后一个条件是使用AND运算符的条件。

我的第一个条件:

Criterion startInRange = Restrictions.between("expectedStartCanonicDate", 
                                               rangeStart, rangeEnd);

我的第二个条件:

Criterion endInRange = Restrictions.between("expectedCompletionCanonicDate", 
                                             rangeStart, rangeEnd);

我的第三个条件需要和以下两个条件一起:

criteria.add(Restrictions.le("expectedStartCanonicDate", rangeStart));
criteria.add(Restrictions.ge("expectedCompletionCanonicDate", rangeEnd));

我想要做的限制是condition1或condition2或condition3。我找到了让我接近的例子。我可以一起使用LogicalExpression或前两个条件,但是,我不确定如何or 3个条件,特别是当最后一个条件实际上是两个单独的条件“anded”时。 / p>

有什么想法? 佛瑞德

2 个答案:

答案 0 :(得分:46)

or相关联的一系列限制称为析取。与and关联的一系列限制称为连词。

所以,你需要的是

  • 第三个条件的一个连接
  • 分离第一,第二和第三条件的一个分离:

所以这就是:

Criterion startInRange = Restrictions.between("expectedStartCanonicDate", rangeStart, rangeEnd);

Criterion endInRange = Restrictions.between("expectedCompletionCanonicDate", rangeStart, rangeEnd);

Criterion thirdCondition = 
    Restrictions.conjunction().add(Restrictions.le("expectedStartCanonicDate", rangeStart))
                              .add(Restrictions.ge("expectedCompletionCanonicDate", rangeEnd));

Criterion completeCondition = 
    Restrictions.disjunction().add(startInRange)
                              .add(endInRange)
                              .add(thirdCondition);

criteria.add(completeCondition);

答案 1 :(得分:1)

Criteria criteriaObj = sessionselectreply.createCriteria(TaskReplyVO.class,"taskreply")
                .createAlias("taskreply.objTaskView", "taskview")
                .createAlias("objMailTo", "mailto")
                .add(Restrictions.eq("taskview.longTaskId", taskid))
                .add(Restrictions.eq("mailto.longuserid", userid));