2011-05-05 13 views
12

Aparte de menos código, ¿cuál es la diferencia entre los siguientes dos enfoques para crear una cláusula IN utilizando la API de criterios de Hibernate? ¿Hay problemas de rendimiento? ¿Hay alguna lógica en la recuperación que me falta? Ambos parecen realizar lo mismo en cuanto a las filas devueltas.Hibernate Restrictions.in vs. Disyunction

Disjunction disj = Restrictions.disjunction(); 
for (String value : stringArray) { 
    disj.add(Restrictions.eq("code", value)); 
} 
where.add(disj); 

VS.

Restrictions.in("code", stringArray); 

La razón que pido es porque estoy refactorización código heredado en el que el primero existe, pero que estaba esperando este último. Si ambos son lo mismo, voy a dejar el código heredado solo.

Respuesta

11

Hibernate Disjunction se utiliza para

 Group expressions together in a single disjunction 

lo que significa que, si se tiene que comparar con los valores de X, Y o Z condicionalmente, puede iterar sobre y aplicar selective disjunction

Así que lo ideal en su caso Restrictions.in y Restrictions.Disjunction hace lo mismo, prefiero el primero en este caso.

+0

Parece que el segundo enfoque es más conciso, sin necesidad de bucles. Tu explicación tiene sentido, sin embargo. Gracias. – sma

+1

@sma: cuando digo ex, me refería a la primera (Restrictions.in) en mi publicación, y no a su publicación :) – Narayan

5

Restricciones. La disyunción nos da un control explícito, por ejemplo, permite un operador similar, mientras que en el operador no.

Por ejemplo:

criteria.add(Restrictions.disjunction() 
         .add(Restrictions.eq("bill.stateCd", null)) 
         .add(Restrictions.eq("bill.stateCd", "")) 
         .add(Restrictions.ilike("bill.stateCd","%"+stateCd+"%"))); 

biselan consigue con en

criteria.add(Restrictions.in("bill.stateCd", Arrays.asList(null,"", "%"+stateCd+"%"))); 
+0

¿Por qué votos negativos? – Ram

2

Con el código dado los dos se comportan de manera muy diferente cuando stringArray tiene elementos cero.

El uso de Disyunción con expresiones cero produce una consulta SQL válida con 1=1 o equivalente.

Restrictions.in conduce al operador IN sin valores, que a menudo (aunque puede tratarse con algún dialecto SQL) es sintácticamente incorrecto.