2016-05-25 10 views
0

Wir haben ein Szenario, wo 2 Anwendungen auf die gleiche Oracle-Datenbank/Tabellen verweisen und einige Abfragen ausführen. DB Team schlug vor, Kommentare in SQL zu verwenden, die es ihnen ermöglichen, zu identifizieren, mit wem sie sich für langsame Abfragen in Verbindung setzen sollten.Geben Sie Kommentare in JPQL benannte Abfragen

Da wir die JPA verwenden, bin ich nicht sicher wie können wir Kommentare für die JPQL-Abfragen definieren, die von JPA in native SQL konvertiert werden. Wenn wir die Kommentare in JPQL geben Sie dann bricht es

 @NamedQuery(name = Consts.LOOKUP_BY_END_DATE, query = " 
/* comment */ SELECT b FROM TableB b WHERE " 
       + " b.id.ObjId=:ObjId AND b.id.persId=:persId and b.recEffEndDayKy=:recEffEndDayKy "), 

Ausnahme:

Exception Description: Syntax error parsing [/* comments */SELECT b FROM TableB b WHERE b.id.ObjId=:ObjId AND b.id.PersId=:PersId and b.recEffEndDayKy=:recEffEndDayKy ]. 
[0, 157] The query does not start with a valid identifier, has to be either SELECT, UPDATE or DELETE FROM. 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155) 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334) 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278) 
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142) 
    at org.eclipse.persistence.internal.jpa.JPAQuery.processJPQLQuery(JPAQuery.java:223) 
    at org.eclipse.persistence.internal.jpa.JPAQuery.prepare(JPAQuery.java:184) 
    at org.eclipse.persistence.queries.DatabaseQuery.prepareInternal(DatabaseQuery.java:624) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQuery(AbstractSession.java:4366) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.processJPAQueries(AbstractSession.java:4326) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:598) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:818) 
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:762) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:265) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:731) 
    ... 33 more 
+1

JPQL BNF ist sehr klar, dass es kein solches Konzept eines "Kommentars" gibt. Ich habe keine Ahnung, was eine "JPA generierte Abfrage" ist ... JPA generiert keine Abfragen, der Benutzer tut –

+0

Wenn Sie Named Query in JPQL schreiben, ist dies nicht die Abfrage, die gegen die DB ausgeführt wird. JPA konvertiert JPQL in natives SQL und läuft auf DB. Wenn wir Persistence/Merge/Remove für Entitätsmanager aufrufen, generiert es tatsächlich INSERT/UPDATE/DELETE-Abfragen, die in der Zieldatenbank ausgeführt werden. –

+1

Und wie gesagt ... Sie können keinen Kommentar in JPQL haben. Es ist ILLEGAL Syntax. Es wird also nicht in SQL konvertiert. Die Nachricht sagt Ihnen dies ... Ihre Abfrage (JPQL) muss mit einem gültigen Schlüsselwort (SELECT) beginnen! –

Antwort

2

Ich glaube, Sie nativen Abfragen verwirrt haben, die SQL mit dem Namen JPQL Anfragen akzeptieren. JPQL unterstützt keine Kommentare. Wenn Sie die Abfrage steuern möchten, müssen Sie SQL verwenden oder die systemeigene EclipseLink-Funktionalität verwenden. Siehe die hier beschriebene "SQL" -Funktion http://java-persistence-performance.blogspot.com/2012/05/jpql-vs-sql-have-both-with-eclipselink.html

+0

Nopes, ich bin nicht mit nativen SQL-Abfragen verwechselt :) Deshalb ist explizit erwähnt in Thema und Erklärung JPA Generierte Abfragen –

+0

überprüfen Sie den Link dann, da die einzige Möglichkeit, etwas zum generierten SQL hinzugefügt wird durch die sein 'SQL' Schlüsselwort von EclipseLink. – Chris