Question

Je suis un jouer cadre Développeur de l'application.Je suis à l'aide de createNativeQuery méthode en JPA.Dans cet exemple, je veux utiliser une instruction préparée.Quiconque s'il vous plaît m'aider?Voici le code sans JPA.J'ai besoin d'aide pour convertir une instruction Préparée.

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);
Était-ce utile?

La solution

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);

Autres conseils

Bref Résumé

Vous devez utiliser les paramètres de la requête ici, mais depuis que vous êtes à l'aide d'un requête native, vous pouvez être limité dans vos choix par rapport à JPQL.

L'état du Monde

Vous avez peut-être limité de paramètres positionnels:

JPA ne nécessite pas natif des requêtes en charge les paramètres nommés, mais certains JPA fournisseurs

L'implémentation Hibernate de la JPA prend en charge les paramètres nommés:

Natif SQL les requêtes de soutien de position ainsi que les paramètres nommés


Solution

Hibernate

Subir Kumar Sao réponse montre comment résoudre ce problème en utilisant des paramètres nommés.C'est possible, au moins dans Hibernate.

Je vais le répéter ici par souci de comparaison:

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);

Générique JPA (y compris EclipseLink)

J'ai trouvé que, avec EclipseLink (2.5.1), les paramètres nommés n'étaient pas pris en charge.

Au lieu de cela, il est nécessaire d'utiliser des paramètres positionnels.Ces peut être exprimé de deux façons — explicitement et implicitement.

Index explicite

Marque paramètre à l'aide de ?1 (ou un autre nombre).Cet indice peut être utilisé pour identifier de manière unique ce paramètre précis dans votre requête.

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);

Indice implicite

Marque paramètre à l'aide de seulement ?.Son indice est basé sur la séquence de tous les paramètres de chaîne de requête.

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);

Notes

Observer que:

  • Les paramètres positionnels sont 1-indexé.
  • La clé dans le Query paramètre de la carte est tout simplement l'index du paramètre de position.

D'autres sources

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top