Jpa 在JPQL命名查询中指定注释
我们有一些场景,其中两个应用程序指向相同的oracle数据库/表并执行一些查询。 DB团队建议在SQL中使用注释,以帮助他们确定在运行缓慢的查询中应该联系谁 由于我们使用的是JPA,我不确定如何为JPA转换为本机SQL的JPQL查询定义注释。 如果我们在JPQL中指定注释,那么它就会中断Jpa 在JPQL命名查询中指定注释,jpa,eclipselink,Jpa,Eclipselink,我们有一些场景,其中两个应用程序指向相同的oracle数据库/表并执行一些查询。 DB团队建议在SQL中使用注释,以帮助他们确定在运行缓慢的查询中应该联系谁 由于我们使用的是JPA,我不确定如何为JPA转换为本机SQL的JPQL查询定义注释。 如果我们在JPQL中指定注释,那么它就会中断 @NamedQuery(name = Consts.LOOKUP_BY_END_DATE, query = " /* comment */ SELECT b FROM TableB b WHER
@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 "),
例外情况:
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
我相信您已经将接受SQL的本机查询与命名的JPQL查询混淆了。JPQL不支持注释。如果要控制查询,必须使用SQL或本机EclipseLink功能。请参阅此处描述的“SQL”函数我相信您已经将接受SQL的本机查询与命名的JPQL查询混淆了。JPQL不支持注释。如果要控制查询,必须使用SQL或本机EclipseLink功能。请参阅此处描述的“SQL”函数Nopes,我不会与本机SQL查询混淆:)这就是我在主题和解释JPA生成的查询中明确提到的原因请查看链接,因为向生成的SQL添加内容的唯一方法是通过EclipseLink提供的“SQL”关键字。Nopes,我不会与原生SQL查询混淆:)这就是我在主题和解释JPA生成的查询中明确提到的原因请查看链接,因为向生成的SQL添加内容的唯一方法是通过EclipseLink提供的“SQL”关键字。JPQL BNF非常清楚,没有“注释”的概念。我不知道“JPA生成的查询”是什么。。。JPA不生成查询,用户生成。当您在JPQL中编写命名查询时,这不是针对DB运行的查询。JPA将JPQL转换为本机SQL并在DB上运行。当我们在实体管理器上调用persist/merge/remove时,它实际上会生成在目标数据库上运行的INSERT/UPDATE/DELETE查询。。。在JPQL中不能有注释。这是非法的语法。所以它不会转换成SQL。消息告诉你。。。您的查询(JPQL)必须以有效的关键字(SELECT)开头!JPQL BNF非常清楚,不存在这样的“评论”概念。我不知道“JPA生成的查询”是什么。。。JPA不生成查询,用户生成。当您在JPQL中编写命名查询时,这不是针对DB运行的查询。JPA将JPQL转换为本机SQL并在DB上运行。当我们在实体管理器上调用persist/merge/remove时,它实际上会生成在目标数据库上运行的INSERT/UPDATE/DELETE查询。。。在JPQL中不能有注释。这是非法的语法。所以它不会转换成SQL。消息告诉你。。。您的查询(JPQL)必须以有效的关键字(SELECT)开头!