2016-09-26 2 views
0

Ich versuche, die native Abfrage mit JPA 2.0.I auszuführen hat meine Mutter Abfrage in der orm.xml definiertParamertized india Abfrage leer resultset [Parameter als durch Komma getrennte Zeichenfolge] Rückkehr (mit JPA)

Orm.xml 
    <named-native-query name="getAgencyUsersByRoles"> 
     <query><![CDATA[SELECT DISTINCT a1.USR_LOGIN,c.PERSON_FIRST_NAME,c.PERSON_LAST_NAME,a1.EMAIL, b.auth_role_code FROM USERS a1,PERSON_AUTH_ROLES b,PERSON c WHERE ((b.group_code = 'RCATAG' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN (?)) OR (b.group_code = 'RCEMP' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN (?))) AND a1.email IS NOT NULL AND a1.status in ('ACTIVE','PASSWORD EXPIRED') ORDER BY a1.usr_login]]></query> 
    </named-native-query> 

Code von wo aus ich die Abfrage mit jpa ausführe.

Query query = getEntityManager() 
      .createNamedQuery(NotificationPersistenceConstants.GET_AGENCY_USERS_BY_ROLES); 
    query.setParameter(1, roles); 
    query.setParameter(2, cccRoles); 
    // fetch the results 
    List<Object[]> list = query.getResultList(); 

Diese Abfrage führt keine Ausnahme während der Ausführung ich meine appplication der JPA-Protokolle überprüft aber gibt mir leer resultset.

Wenn ich die gleiche Abfrage in meinem DB-Server fire bekomme ich die Ergebnismenge, die beweist, dass meine Abfrage keine Probleme hat und auch Tabelle enthält Datensätze für diese Abfrage zurückgeben.

Ich habe versucht, meine native Abfrage zu brechen und sie einfach als separate native Abfragen für alle Tabellen auszuführen, die ich in der Abfrage habe. Unten ist, was ich versuchte mit der DISTINCT-Klausel zu überprüfen, ob DISTINCT Schlüsselwort der Schuldige sein könnte. Aber sie alle arbeiteten gut und gab Ergebnis unter List<Object[]>

SELECT DISTINCT a1.USR_LOGIN FROM USERS a1 ORDER BY a1.usr_login 
SELECT DISTINCT b.auth_role_code FROM PERSON_AUTH_ROLES b 
SELECT DISTINCT c.PERSON_LAST_NAME FROM PERSON c 

aktualisiert die Rollen & cccRoles Abfrage paramters, die ich in der Abfrage bin vorbei.

roles = 'teller','lender','bacth',etc... // This list is dynamically created at runtime 
cccRoles = 'cccadmin','ccuser',etc // This list is dynamically created at runtime 

Jetzt bin ich mir nicht sicher, was das Problem ist.

Frage? - Sollte nicht so sein, wie ich verifiziert habe, die gleiche Abfrage direkt im DB-Server ausgeführt und gut gearbeitet.

EntityManager (JPA)? - Alle Konfigurationen überprüft und auch einzelne Abfragen ausgeführt und das Ergebnis zurückbekommen.

tritt? ...

Bitte helfen Sie mir, wenn jemand das gleiche Problem aufgetreten 8.5 wurde mit JPA 2.0.

+0

Versuchen Sie, Abfragen zurückzuverfolgen. F .: "alter session set events" 10046 trace name context für immer, level 12 '; ' –

Antwort

1

Ok Ich konnte einen Drilldown zu meinem Problem durchführen und stellte fest, dass das Problem mit den Parametern auftrat, die ich auf mein Query-Objekt gesetzt hatte.

Culprit Codezeilen:

String roles = 'teller','lender','bacth';// This list is dynamically created at runtime of nth elements 
Strign cccRoles = 'cccadmin','ccuser';// This list is dynamically created at runtime of nth elements 
Query query = getEntityManager().createNamedQuery(NotificationPersistenceConstants.GET_AGENCY_USERS_BY_ROLES); 
query.setParameter(1,roles); 
query.setParameter(1,cccRoles); 

Hier in meinem obigen Code der roles & cccRoles Zeichenfolge gegen einen einzelnen ersetzt zu werden? Platzhalter in meiner Query-Zeichenfolge. Wenn also die Abfrage interpretiert wurde, wurde die gesamte Zeichenfolge (z. B. 'Kassierer', 'Kreditgeber', 'Bacth') mit einer angegebenen Spalte b.auth_role_code gegen jeden DB-Datensatz in der Datenbank abgeglichen und daher didn Habe nichts dagegen gefunden.

Während, wenn ich durch Substitution direkt diese String-Parameter (roles & cccRoles) in der Abfrage und rufen Sie dann createNativeQuery() funktioniert es so etwas wie die gleiche Abfrage-String in Java bauen würde:

Query query = getEntityManager().createNativeQuery("SELECT DISTINCT a1.USR_LOGIN,c.PERSON_FIRST_NAME,c.PERSON_LAST_NAME,a1.EMAIL, b.auth_role_code FROM USERS a1,PERSON_AUTH_ROLES b,PERSON c WHERE ((b.group_code = 'RCATAG' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN ('teller','lender','bacth')) OR (b.group_code = 'RCEMP' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN ('cccadmin','ccuser'))) AND a1.email IS NOT NULL AND a1.status in ('ACTIVE','PASSWORD EXPIRED') ORDER BY a1.usr_login"); 

Bottom: Immer wenn eine Subsition von ?(placeholder) in der SQL-Abfrage unter Verwendung setParameter in Query Objekt passiert, wird es als eine einzelne Spalte Wert zugeordnet, obwohl die übergebene Parameter Zeichenfolge Komma getrennt ist.

Wenn dieselbe Abfrage in Java erstellt wird, indem die Parameterzeichenfolge direkt verkettet wird (ohne setParameter zu verwenden) und dann ausgeführt wird, funktioniert sie und betrachtet sie als Liste der zu suchenden Zeichenfolge.

Mögliche Lösungen für solche Situationen:

  • die komplette Abfrage verketten alle solche dynamische Liste von String-params ersetzen und bauen (ohne setParameter() zu verwenden) am ausführen createNativeQuery()
  • Verwenden Kriterien Builder-API. von JPA-Provider und erstellen Sie die Abfrage und dann ausführen. (Empfohlen)
  • Build erforderlich Nr. von ?(placeholders) basierend auf der Größe unserer Liste und rufen Sie dann gleichwertige Nr. von setParameters in der Schleife.

  • ?? (Jeder hat eine andere bessere Lösung für diese Situation plz help.)

Obwohl ich immer noch eine Antwort zu bekommen versuchen, was ist der Unterschied zwischen dem Aufbau des gleichen Abfrage-String zur Laufzeit in Java und Aufruf createNativeQuery vs wenn Ich habe die Abfrageparameter mit query.setParameter() festgelegt.

0

Dies kann wahrscheinlich daran liegen, dass Sie die verketteten Parameter 'teller','lender','bacth' in einem einzigen Parameter übergeben und daher als einzelner String-Parameter in jpa verglichen werden. Daher gibt es keine Ergebnisse zurück.

Verwandte Themen