Pregunta

Soy un desarrollador de aplicaciones Marco de juego. Estoy usando createnateQuyery método en JPA.En este ejemplo quiero usar una declaración preparada.Por favor, alguien me ayude? Aquí está el código sin JPA.Necesito ayuda para convertirlo para preparar declaración.

Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join" +
    "box b where t.truck_id=b.truck_id and t.shipment_upc='" + code + "'");

BigInteger val = (BigInteger)query.getSingleResult();
System.out.println(val);

¿Fue útil?

Solución

Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join box b where t.truck_id=b.truck_id and t.shipment_upc=:code");
query.setParameter("code", code);

Otros consejos

Resumen breve

Debe usar los parámetros de la consulta aquí, pero como está utilizando una consulta nativa , puede estar limitado en sus opciones en comparación con JPQL.

Estado del mundo

Puede ser limitado a los parámetros posicionales :

JPA no requiere compatibilidad con las consultas nativas nombradas parámetros, pero algunos proveedores de JPA pueden

IMPLEMENTACIÓN DE HIBERNATE DE JPA Soporta los parámetros nombrados :

Consultas nativas de SQL Soporte posicional, así como los parámetros con nombre


SOLUCIÓN

Hibernate

La respuesta de Subir Kumar Sao muestra cómo Resuelve esto usando parámetros con nombre. Esto es posible al menos en hibernación.

Lo repetiré aquí por el bien de la comparación:

Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = :code"
);
query.setParameter("code", code);

JPA genérico (incluidos EclipsElink)

Descubrí que con EclipsElink (2.5.1), los parámetros con nombre no fueron compatibles.

En su lugar, se hace necesario usar parámetros posicionales. Estos se pueden expresar de dos maneras, explícitamente e implícitamente.

Índice explícito

Marque el parámetro usando ?1 (o algún otro número). Este índice se puede utilizar para identificar de forma única ese parámetro en particular en su consulta.

Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?1"
);
query.setParameter(1, code);

Índice implícito

Marque el parámetro usando solo ?. Su índice se basará en la secuencia de todos los parámetros que participan en su cadena de consulta.

Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?"
);
query.setParameter(1, code);

Notas

Observa que:

  • Los parámetros posicionales son 1-indexados.
  • La clave en el mapa de parámetros de Query es simplemente el índice del parámetro posicional.

Fuentes adicionales

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