Como usar a instrução preparada no JPA
-
21-12-2019 - |
Pergunta
Eu sou um play framework de desenvolvimento de aplicações.Eu estou usando createNativeQuery método em JPA.Neste exemplo eu quero usar instrução preparada.Por favor, alguém me ajuda?Aqui está o código sem JPA.Eu preciso de ajuda para convertê-lo para instrução Preparada.
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);
Solução
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);
Outras dicas
Breve Resumo
Você precisa usar os parâmetros de consulta aqui, mas desde que você está usando um consulta nativa, você pode ser limitado em suas opções em comparação com a JPQL.
Estado do Mundo
Você pode ser limitado aos parâmetros posicionais:
JPA não necessitam de consultas nativas suporte a parâmetros nomeados, mas alguns provedores podem JPA
O Hibernate implementação do JPA oferece suporte a parâmetros nomeados:
Consultas SQL nativas apoio posicional, bem como parâmetros de chamada
Solução
O Hibernate
Subir Kumar São a resposta mostra como resolver isso usando parâmetros nomeados.Isso é possível pelo menos em modo de Hibernação.
Vou repetir aqui para fins de comparação:
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);
Genérico JPA (incluindo EclipseLink)
Eu achei que com EclipseLink (2.5.1), denominado parâmetros não eram compatíveis.
Em vez disso, torna-se necessário o uso de parâmetros posicionais.Estes podem ser expressos de duas maneiras — de forma explícita e implicitamente.
Índice explícito
Marque o parâmetro usando ?1
(ou outro número).Este índice pode ser usado para identificar que determinado parâmetro na 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 o parâmetro usando apenas ?
.Seu índice será com base na sequência de todos os parâmetros de participar em sua seqüência de caracteres 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
Observar que:
- Parâmetros posicionais são: 1-indexados.
- A chave na
Query
mapa de parâmetro é simplesmente o índice do parâmetro posicional.