Pregunta ¿Cómo se combinan los criterios "O" cuando se utiliza una consulta de criterios con hibernación?


Intento hacer un "OR" básico en tres campos usando una consulta de criterios de hibernación.

Ejemplo

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

Me gustaría crear una consulta de criterios donde mi cadena de búsqueda podría coincidir con "nombre" o "dirección" o "número de teléfono".


75
2017-09-11 20:04


origen


Respuestas:


Quieres usar Restrictions.disjuntion(). Al igual que

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

Ver el documento de Hibernate aquí.


124
2017-09-11 20:23



Suponiendo que tenga una sesión de hibernación a mano, entonces algo como lo siguiente debería funcionar:

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

62
2017-09-11 20:31



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

// Lo mismo se puede hacer para (c1 OR c2) Y c3, o cualquier expresión compleja.


9
2017-08-13 10:37



//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.

6
2017-08-13 19:09



En caso de que alguien se tropiece con esto con la misma pregunta para 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)));

3
2017-09-12 10:40



Las condiciones se pueden aplicar usando el / y en diferentes niveles de la consulta usando la disyunción

Criteria query = getCriteria("ENTITY_NAME");
query.add(Restrictions.ne("column Name", current _value));

Disjunction disjunction = Restrictions.disjunction();

if (param_1 != null)
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param1)));

if (param_2 != null)
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param_2)));

if (param_3 != null)
    disjunction.add(Restrictions.or(Restrictions.eq("column Name", param_3)));
if (param_4 != null && param_5 != null)
    disjunction.add(Restrictions.or(Restrictions.and(Restrictions.eq("column Name", param_4 ), Restrictions.eq("column Name", param_5 ))));

if (disjunction.conditions() != null && disjunction.conditions().iterator().hasNext())
    query.add(Restrictions.and(disjunction));

return query.list();

1
2018-04-08 07:45