Подтвердить что ты не робот

Как использовать объекты Hibernate Criteria для нескольких и/или условий

Мне нужно создать ограничение на спящий режим, равное 3 Условиям. Проблема в том, что последнее условие обстоятельно зависит от условий с использованием оператора И.

Мое первое условие:

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. Я нашел примеры, которые подталкивают меня. Я могу использовать логическое выражение или первые два условия вместе, однако я не уверен, как or 3 условия, особенно когда последнее условие действительно представляет собой два отдельных условия "anded" вместе.

Любые мысли? Фред

4b9b3361

Ответ 1

Последовательность ограничений, связанных с 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);

Ответ 2

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));