Estoy tratando de hacer un "O" 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".
(name = x AND address = y) OR (phoneNumber = z)
?Suponiendo que tiene una sesión de hibernación a mano, 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);
fuente
//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);
// Se puede hacer lo mismo para (c1 O c2) Y c3, o cualquier expresión compleja.
fuente
//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.
fuente
En caso de que alguien se tope 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)));
fuente
Las condiciones se pueden aplicar usando el o / y en diferentes niveles de la consulta usando 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();
fuente
Esto es lo que funcionó para mí para una condición OR, que también con una condición IN y no la respuesta más votada en esta discusión:
criteria.add( Restrictions.or( Restrictions.eq(ch.getPath(ch.propertyResolver().getXXXX()), "OR_STRING"), Restrictions.in(ch.getPath(ch.propertyResolver().getYYYY()), new String[]{"AA","BB","CC"}) ));
Consulta resultante:
and ( this_.XXXX=? or this_.YYYY in ( ?, ?, ? ) )
fuente
Si alguien está usando CriteriaQuery en lugar de Criteria, puede poner todas sus expresiones en una
Predicate
lista y poner un OR por tamaño de predicados como este:List<Predicate> predicates = new ArrayList<>(); if (...) { predicates.add(...); } criteriaQuery.where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
fuente