79 votes

Comment faire un "OR" des critères ensemble en utilisant une requête de critères avec hibernate ?

J'essaie d'effectuer un "OR" de base sur trois champs à l'aide d'une requête de critères Hibernate.

Exemple

class Whatever{
 string name;
 string address;
 string phoneNumber;
}

J'aimerais construire une requête de critères où ma chaîne de recherche pourrait correspondre à "nom" ou "adresse" ou "numéro de téléphone".

137voto

sblundy Points 27163

Vous voulez utiliser Restrictions.disjuntion() . Comme ça

session.createCriteria(Whatever.class)
    .add(Restrictions.disjunction()
        .add(Restrictions.eq("name", queryString))
        .add(Restrictions.eq("address", queryString))
        .add(Restrictions.eq("phoneNumber", queryString))
    );

Voir la documentation sur Hibernate aquí .

0 votes

C'est parfait, merci ! J'ai finalement trouvé un exemple en ligne, mais je suis content qu'il soit ici pour référence future.

8 votes

Et si je voulais (name = x AND address = y) OR (phoneNumber = z) ?

72voto

Rob Oxspring Points 1457

En supposant que vous ayez une session hibernate sous la main, quelque chose comme ce qui suit devrait fonctionner :

Criteria c = session.createCriteria(Whatever.class);
Disjunction or = Restrictions.disjunction();
or.add(Restrictions.eq("name",searchString));
or.add(Restrictions.eq("address",searchString));
or.add(Restrictions.eq("phoneNumber",searchString));
c.add(or);

4 votes

J'aime la syntaxe qui consiste à créer la Disjonction et à la nommer ou. C'est beaucoup plus lisible que l'autre solution.

0 votes

C'était génial :) Je suis également d'accord avec @ScArcher2, il est très lisible et a rendu l'exemple plus compliqué que je devais faire beaucoup plus facile à comprendre.

12voto

Dharmender Rawat Points 129
    //Expression :  (c1 AND c2) OR (c3)      

     Criteria criteria = session.createCriteria(Employee.class);

      Criterion c1 = Restrictions.like("name", "%e%");
      Criterion c2 = Restrictions.ge("salary", 10000.00);
      Criterion c3 = Restrictions.like("name", "%YYY%");
      Criterion c4 = Restrictions.or(Restrictions.and(c1, c2), c3);
      criteria.add(c4);

//La même chose peut être faite pour (c1 OR c2) AND c3, ou toute autre expression complexe.

6voto

Dharmender Rawat Points 337
//Expression :  (c1 AND c2) OR (c3)      

 Criteria criteria = session.createCriteria(Employee.class);

  Criterion c1 = Restrictions.like("name", "%e%");
  Criterion c2 = Restrictions.ge("salary", 10000.00);
  Criterion c3 = Restrictions.like("name", "%YYY%");
  Criterion c4 = Restrictions.or(Restrictions.and(c1, c2), c3);
  criteria.add(c4);

  //Same thing can be done for (c1 OR c2) AND c3, or any complex expression.

3voto

Geir-Tore Lindsve Points 769

Juste au cas où quelqu'un tomberait sur ce sujet avec la même question pour NHibernate :

ICriteria c = session.CreateCriteria(typeof (Whatever))
    .Add(Expression.Disjunction()
        .Add(Expression.Eq("name", searchString))
        .Add(Expression.Eq("address", searchString))
        .Add(Expression.Eq("phoneNumber", searchString)));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X