Как использовать объекты Hibernate Criteria для нескольких и / или условий - PullRequest
12 голосов
/ 19 ноября 2011

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

Есть мысли? Фред

Ответы [ 2 ]

46 голосов
/ 19 ноября 2011

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