Comment utiliser l'instruction préparée en JPA
-
21-12-2019 - |
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);
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.