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);
War es hilfreich?

Lösung

generasacodicetagpre.

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.

Zusätzliche Quellen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top