Comment utiliser les objets Hibernate Criteria pour les conditions multiples et/ou

je dois créer une restriction de critères D'hibernation qui ors 3 Conditions. Le problème est que la dernière condition est acutally aux conditions en utilisant l'opérateur et.

Ma première condition:

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

ma deuxième condition:

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

MON troisième condition besoins ET les deux conditions suivantes ensemble:

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

la restriction que je veux faire est condition1 ou condition2 ou condition3. J'ai trouvé des exemples qui me fermer. Je peut utiliser une expression logique ou les deux premières conditions ensemble, cependant, je ne suis pas sûr comment or 3 conditions, en particulier quand la dernière condition est vraiment deux conditions séparées 'anded " ensemble.

Des Idées? Fred

12
demandé sur theGamblerRises 2011-11-19 17:09:58

2 réponses

une séquence de restrictions liée à or s'appelle une disjonction. Une séquence de restrictions liée à and s'appelle une conjonction.

Donc, ce que vous avez besoin est

  • une conjonction pour votre troisième condition
  • une disjonction pour lier les première, deuxième et troisième conditions:

Alors voilà:

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);
46
répondu JB Nizet 2011-11-19 13:41:17
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));
1
répondu user3572247 2014-04-25 09:05:36