2008-09-11 18 views

Respuesta

123

Quiere 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 Hibernate here.

+0

Eso es perfecto, gracias! Finalmente encontré un ejemplo en línea, pero me alegra que esté aquí para futuras referencias. – ScArcher2

+3

¿Qué pasa si quiero '(name = x AND address = y) O (phoneNumber = z)'? –

61

Asumiendo que tiene 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); 
+4

Me gusta la sintaxis de crear la Disyunción y nombrarla o. Es mucho más legible que la otra solución. – ScArcher2

+0

Esto fue genial :) También estoy de acuerdo con @ ScArcher2, es muy legible e hizo el ejemplo más complicado que tuve que hacer mucho más fácil de entender. –

3

Sólo en caso de que alguien debería tropezar 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))); 
8
//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.

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

Las condiciones se pueden aplicar mediante 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(); 
+0

¿es posible obtener nulo para todos los elementos que no se encuentran en el db? – fiddle

+0

Es consistente: se devuelve una lista con todos los resultados, ya sea que los haya o no. –

Cuestiones relacionadas