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);
Foi útil?

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.

Fontes adicionais

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top