webentwicklung-frage-antwort-db.com.de

Wie verwende ich einen dynamischen Parameter in einer IN-Klausel einer mit JPA benannten Abfrage?

mein Problem betrifft diese Art von Abfrage:

select * from SOMETABLE where SOMEFIELD in ('STRING1','STRING2');

der vorherige Code funktioniert gut in SQL Developer .. _ Die gleiche statische Abfrage funktioniert auch gut und gibt mir ein paar Ergebnisse zurück.

Query nativeQuery = em.createNativeQuery(thePreviousQuery,new someResultSet());
return nativeQuery.getResultList();

Wenn ich versuche, dies zu parametrieren, stoße ich auf ein Problem.

final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in (?selectedValues)";
Query nativeQuery = em.createNativeQuery(parameterizedQuery ,new someResultSet());
nativeQuery.setParameter("selectedValues","'STRING1','STRING2'");
return nativeQuery.getResultList();

Ich habe kein Ergebnis (aber keine Fehlermeldung in der Konsole). Und wenn ich das Protokoll anschaue, sehe ich so etwas:

select * from SOMETABLE where SOMEFIELD in (?)
bind => [STRING1,STRING2]

Ich habe auch versucht, keine Anführungszeichen (mit ähnlichem Ergebnis) oder nicht geordnete Parameter (: selectedValues) zu verwenden, was zu einem solchen Fehler führt:

SQL Error: Missing IN or OUT parameter at index:: 1

Ich habe versucht, die Klammern anstelle der Abfrage direkt in den Parameter zu setzen, aber das funktionierte auch nicht ...

Ich könnte meine Abfrage zur Laufzeit so erstellen, dass sie mit dem ersten (Arbeits-) Fall übereinstimmt, aber ich mache es lieber auf die richtige Weise. Wenn also jemand eine Idee hat, lese ich sie mit großem Interesse!

Zu Ihrer Information: JPA Version 1.0Oracle 11G

13
Marvin

JPA unterstützt die Verwendung einer Auflistung als Parameter für ein Listenliteral nur in JPQL-Abfragen, nicht in nativen Abfragen. Einige JPA-Anbieter unterstützen es als proprietäre Funktion, sind jedoch nicht Teil der JPA-Spezifikation (siehe https://stackoverflow.com/a/3145275/1285097 ).

Benannte Parameter in nativen Abfragen sind ebenfalls nicht Teil der JPA-Spezifikation. Ihr Verhalten hängt vom Persistenzanbieter und/oder vom JDBC-Treiber ab.

Hibernate mit dem JDBC-Treiber für Oracle unterstützt beide Funktionen.

List<String> selectedValues = Arrays.asList("STRING1", "STRING2");
final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in (:selectedValues)";
return em.createNativeQuery(parameterizedQuery)
         .setParameter("selectedValues", selectedValues)
         .getResultList();
32
Marc-André

Anstatt:

nativeQuery.setParameter("selectedValues", params);

Ich musste verwenden:

nativeQuery.setParameterList("selectedValues", params);
2
Brian

Ersetzen Sie dies:

nativeQuery.setParameter("selectedValues","'STRING1','STRING2'");

mit

List<String> params;
nativeQuery.setParameter("selectedValues",params);
1
Sabuj Hassan

Ich stand auch vor demselben Problem.
Das habe ich getan:

List<String> sample = new ArrayList<String>();
sample.add("sample1");
sample.add("sample2");

Und jetzt können Sie das Beispiel in params setzen.

0
Anand

Das hat für mich beim Derby funktioniert. Parameter ohne "()".

List<String> selectedValues = Arrays.asList("STRING1", "STRING2");
final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in 
:selectedValues";
return em.createNativeQuery(parameterizedQuery)
         .setParameter("selectedValues", selectedValues)
         .getResultList();
0
Pradeep