So verwenden Sie eine vorbereitete Anweisung in JPA
-
21-12-2019 - |
Frage
Ich bin ein Entwickler von Play-Framework-Anwendungen. Ich verwende die Methode createNativeQuery in JPA.In diesem Beispiel möchte ich eine vorbereitete Anweisung verwenden.Bitte hilft mir jemand?Hier ist der Code ohne JPA.Ich brauche Hilfe, um es in eine vorbereitete Anweisung umzuwandeln.
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);
Lösung
Andere Tipps
Kurze Zusammenfassung
Sie müssen hier Abfrageparameter verwenden, aber da Sie a verwenden native Abfrage, Möglicherweise sind Ihre Optionen im Vergleich zu JPQL eingeschränkt.
Zustand der Welt
Vielleicht bist du es auf Positionsparameter beschränkt:
JPA erfordert nicht, dass native Abfragen benannte Parameter unterstützen, einige JPA-Anbieter können dies jedoch tun
Hibernate-Implementierung von JPA unterstützt benannte Parameter:
Native SQL-Abfragen unterstützen sowohl Positions- als auch benannte Parameter
Lösung
Überwintern
Subir Kumar Saos Antwort zeigt, wie man dieses Problem mit benannten Parametern löst.Dies ist zumindest im Ruhezustand möglich.
Zum Vergleich wiederhole ich es hier:
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);
Generisches JPA (einschließlich EclipseLink)
Ich habe festgestellt, dass mit EclipseLink (2.5.1) benannte Parameter nicht unterstützt werden.
Stattdessen ist es erforderlich, Positionsparameter zu verwenden.Diese können auf zwei Arten ausgedrückt werden – explizit und implizit.
Expliziter Index
Markieren Sie den Parameter mit ?1
(oder eine andere Nummer).Dieser Index kann verwendet werden, um diesen bestimmten Parameter in Ihrer Abfrage eindeutig zu identifizieren.
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);
Impliziter Index
Markieren Sie den Parameter mit just ?
.Sein Index basiert auf der Reihenfolge aller Parameter, die an Ihrer Abfragezeichenfolge beteiligt sind.
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);
Anmerkungen
Beachten Sie Folgendes:
- Positionsparameter sind 1-indiziert.
- Der Schlüssel im
Query
Die Parameterzuordnung ist einfach der Index des Positionsparameters.