13

我需要创建一个包含 3 个条件的 Hibernate 标准限制。问题是最后一个条件实际上是使用 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));

我想做的限制是条件1或条件2或条件3。我找到了让我亲近的例子。我可以使用 LogicalExpression 或前两个条件一起使用,但是,我不确定如何使用or3 个条件,特别是当最后一个条件实际上是两个单独的条件“ anded”在一起时。

有什么想法吗?弗雷德

4

2 回答 2

47

与之相关的一系列限制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);
于 2011-11-19T13:36:16.353 回答
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));
于 2014-04-25T09:05:36.097 回答