2014-07-24 2 views
2

J'utilise org.hibernate.criterion.Example.create pour créer ma requête à partir de mon objet Entity. Tout va bien, mais en utilisant cette méthode le SQL est seulement créé avec la clause AND entre les restrictions.Hibernate org.hibernate.criterion.Example.create Clause OR

Est-il possible d'utiliser org.hibernate.criterion.Example.create mais avec la clause OR?

+0

Cela peut vous être utile: http://stackoverflow.com/questions/8126589/hibernate-criteria-restrictions-and-or-combination – TonyGW

Répondre

1

La réponse courte est non, vous ne pouvez pas le faire, mais vous pouvez implémenter un OrExample, c'est assez facile, vérifiez seulement le code source du Example et changez le and pour or (voir sourcecode ligne 329). Puisque les méthodes sont protégées, vous pouvez l'étendre et remplacer seulement le nécessaire.

Quelque chose comme ceci:

public class OrExample extends org.hibernate.criterion.Example { 

    @Override 
    protected void appendPropertyCondition(
     String propertyName, 
     Object propertyValue, 
     Criteria criteria, 
     CriteriaQuery cq, 
     StringBuffer buf) 
    throws HibernateException { 
     Criterion crit; 
     if (propertyValue!=null) { 
      boolean isString = propertyValue instanceof String; 
      if (isLikeEnabled && isString) { 
       crit = new LikeExpression(
         propertyName, 
         (String) propertyValue, 
         matchMode, 
         escapeCharacter, 
         isIgnoreCaseEnabled 
       ); 
      } 
      else { 
       crit = new SimpleExpression(propertyName, propertyValue, "=", isIgnoreCaseEnabled && isString); 
      } 
     } 
     else { 
      crit = new NullExpression(propertyName); 
     } 
     String critCondition = crit.toSqlString(criteria, cq); 
     if (buf.length()>1 && critCondition.trim().length()>0) buf.append(" or "); 
     buf.append(critCondition); 
    } 

Voir la or au lieu du and d'origine.

1

Oui, vous pouvez

session.createCriteria(Person.class) .add(Restrictions.disjunction() .add(Restrictions.eq("name", "James")) .add(Restrictions.eq("age", 20))); 

Dans l'exemple ci-dessus, la classe Person aurait des propriétés nom et l'âge et vous sélectionnerez ces personnes avec le nom = "James" ou age = 20.

+1

La question concerne l'utilisation de la classe 'Example' avec' ou', pas de création ou de critères. –

+0

exactement comme @AVolpe dit. La question est liée à l'exemple. – Santiago

0

un ancien poste de SO peut être utile: Hibernate Criteria Restrictions AND/OR combination

Criteria criteria = getSession().createCriteria(clazz); 
Criterion rest1= Restrictions.and(Restrictions.eq("A", "X"), 
      Restrictions.in("B", Arrays.asList("X","Y"))); 
Criterion rest2= Restrictions.and(Restrictions.eq("A", "Y"), 
      Restrictions.eq("B", "Z")); 
criteria.add(Restrictions.or(rest1, rest2)); 
+0

La question concerne l'utilisation de la classe 'Example' avec' ou', pas de création ou de critères. –

Questions connexes