JPA query parser fails to parse enums with SQL keywords
Description
I have a named query with an ENUM WHERE parameter defined as: @NamedQuery(name = StateArchive.UPDATE_OBJECTID, query = "UPDATE StateArchive a SET a.objectId = :objectId WHERE a.caseId = :caseId AND a.controlEvent = com.logitags.cibet.core.ControlEvent.DELETE")
Creation of the EntityManagerFactory fails with following Exception:
2013-07-20 11:40:15,605 ERROR [ main] (ErrorCounter.java:reportError:50) - line 1:168: unexpected token: . line 1:168: unexpected token: . at org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:876) at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3472) at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3250) at org.hibernate.hql.internal.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3122) at org.hibernate.hql.internal.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2828) at org.hibernate.hql.internal.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:568) at org.hibernate.hql.internal.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2595) at org.hibernate.hql.internal.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2551) at org.hibernate.hql.internal.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2420) at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2346) at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2301) at org.hibernate.hql.internal.antlr.HqlBaseParser.expression(HqlBaseParser.java:2011) at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalExpression(HqlBaseParser.java:1787) at org.hibernate.hql.internal.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:452) at org.hibernate.hql.internal.antlr.HqlBaseParser.updateStatement(HqlBaseParser.java:222) at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:140) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:266) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168) at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:1071) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:519) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1751) at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:920) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:59) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
and
2013-07-20 11:40:15,637 ERROR [ main] (SessionFactoryImpl.java:<init>:524) - HHH000177: Error in named query: com.logitags.cibet.actuator.archive.StateArchive.UPDATE_OBJECTID org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: . near line 1, column 168 [UPDATE com.logitags.cibet.actuator.archive.StateArchive a SET a.objectId = :objectId WHERE a.caseId = :caseId AND a.controlEvent = com.logitags.cibet.core.ControlEvent.DELETE] at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54) at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47) at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:79) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:276) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
However, when I use another ENUM value like com.logitags.cibet.core.ControlEvent.REDO the query passes. I suspect that the Hibernate query parser fails when an ENUM value is an SQL keyword. I tested also with UPDATE and INSERT, they also fail.
Attachments
1
11 Oct 2013, 04:58 PM
Activity
Christian BeikovApril 8, 2022 at 2:31 PM
I'll close this issue as out of date, as I believe it will most probably not be an issue any more in 6.0. If this still is an issue for you, please create a new issue with a test case that reproduces the problem.
Steve EbersoleOctober 28, 2015 at 3:24 AM
As part of verifying that this issue affects 5.0, please just set the "Affects version". Leave the "verify-affects-5.0" label and leave the issue in "Awaiting Response" status; these are critical for us to be able to track these verifications and triage them. Thanks.
Steve EbersoleOctober 27, 2015 at 7:15 PM
This bug report does not indicate that the reported issue affects version 5.x. Versions prior to 5.x are no longer maintained. It would be a great help to the Hibernate team and community for someone to verify that the reported issue still affects version 5.x. If so, please add the 5.x version that you verified with to the list of affected-versions and attach the (preferably SSCCE) test case you used to do the verification to the report; from there the issues will be looked at during our triage meetings.
I have a named query with an ENUM WHERE parameter defined as:
@NamedQuery(name = StateArchive.UPDATE_OBJECTID, query = "UPDATE StateArchive a SET a.objectId = :objectId WHERE a.caseId = :caseId AND a.controlEvent = com.logitags.cibet.core.ControlEvent.DELETE")
Creation of the EntityManagerFactory fails with following Exception:
2013-07-20 11:40:15,605 ERROR [ main] (ErrorCounter.java:reportError:50) - line 1:168: unexpected token: .
line 1:168: unexpected token: .
at org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:876)
at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3472)
at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3250)
at org.hibernate.hql.internal.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3122)
at org.hibernate.hql.internal.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2828)
at org.hibernate.hql.internal.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:568)
at org.hibernate.hql.internal.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2595)
at org.hibernate.hql.internal.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2551)
at org.hibernate.hql.internal.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2420)
at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2346)
at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2301)
at org.hibernate.hql.internal.antlr.HqlBaseParser.expression(HqlBaseParser.java:2011)
at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalExpression(HqlBaseParser.java:1787)
at org.hibernate.hql.internal.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:452)
at org.hibernate.hql.internal.antlr.HqlBaseParser.updateStatement(HqlBaseParser.java:222)
at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:140)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:266)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:1071)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:519)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1751)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:920)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:59)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
and
2013-07-20 11:40:15,637 ERROR [ main] (SessionFactoryImpl.java:<init>:524) - HHH000177: Error in named query: com.logitags.cibet.actuator.archive.StateArchive.UPDATE_OBJECTID
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: . near line 1, column 168 [UPDATE com.logitags.cibet.actuator.archive.StateArchive a SET a.objectId = :objectId WHERE a.caseId = :caseId AND a.controlEvent = com.logitags.cibet.core.ControlEvent.DELETE]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:79)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:276)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
However, when I use another ENUM value like com.logitags.cibet.core.ControlEvent.REDO the query passes.
I suspect that the Hibernate query parser fails when an ENUM value is an SQL keyword. I tested also with UPDATE and INSERT, they also fail.