Pregunta

Estoy tratando de establecer un parámetro en mi consulta, por ejemplo:

select * from Cars where Cars.color NOT IN (:color_params)

Y cuando estoy añadiendo el parámetro en mi JavaClass es como:

...
query.setParameter("color_params", "RED,BLUE");
...

Y esto no está funcionando, sólo se está trabajando con sólo un parámetro .
He tratado con "'RED','BLUE'" y no está trabajando para.

Si pongo mis parámetros en la consulta está trabajando, por ejemplo:

select * from Cars where Cars.color NOT IN ('RED','BLUE')

Lo que estoy haciendo mal!?

Gracias de antemano

¿Fue útil?

Solución

Se supone que para pasar una lista.

List<String> colors = ....;
String query = "select * from Cars where Cars.color NOT IN (:color_params)";
Map<String, Object> params = new HashMap<String, Object>();
params.put("color_params", colors);
// ... execute the query with the param.

También puede hacer:

query.setParameter("color_params", colors);

Como regla general, a menudo es preferido para pasar parámetros a una consulta fija, en lugar de la personalización de la cadena. Las ventajas podrían ser:

  1. Reducción de análisis : implementación de JPA (al menos Hibernate) tienen un duro trabajo de análisis de cada consulta. Por lo que la consulta analizada entra en una memoria caché, para ser reutilizado. Si la cadena de consulta es construir en tiempo de ejecución a partir de parámetros, puede ser que no sea el doble de la misma, por lo que una gran cantidad de tiempo, la potencia de cálculo y la memoria caché se pierden. Pero si se utiliza la misma cadena de consulta con diferentes parámetros, bingo:. Rápidos, bajo uso de memoria, bajo requerimiento de la CPU
  2. Evitar la inyección de SQL . Esta garantía se ofrece si utiliza parámetros. Si usted construye su cadena de consulta con los parámetros, tiene que proveerse esta garantía ...!

Otros consejos

Debe pasar en una lista de cadenas, ni una sola cadena. JPA no analiza sus valores, se les debe dividirse a sí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top