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
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 –
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. –
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! –