|
In one specific situation the Hibernate fails to parse the JPQL query correctly. When there is "select" query with "left outer join" with "select size" on join part - the hiberante falls with "String index out of range: -5" exception.
I first encountered this with MSSQL database, and then succesfully reproduced the bug with HSQL database. I will attach to this issue a simple maven project that reproduces this bug.
The JPQL query, that makes hibernate fall looks like this: "Select a, b.size from EntityA a left outer join a.entityBList b";
Strangely, if you change in that query "left outer join" to "join", it Hibernate stops from falling with exception.
Here is full stacktrace:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5 at java.lang.String.substring(String.java:1875) at org.hibernate.hql.internal.CollectionSubqueryFactory.createCollectionSubquery(CollectionSubqueryFactory.java:52) at org.hibernate.hql.internal.ast.tree.FromElementType.toColumns(FromElementType.java:400) at org.hibernate.hql.internal.ast.tree.FromElementType.toColumns(FromElementType.java:382) at org.hibernate.hql.internal.ast.tree.FromElement.toColumns(FromElement.java:504) at org.hibernate.hql.internal.ast.tree.DotNode.getColumns(DotNode.java:139) at org.hibernate.hql.internal.ast.tree.DotNode.initText(DotNode.java:261) at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:255) at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:126) at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:121) at org.hibernate.hql.internal.ast.tree.DotNode.resolveSelectExpression(DotNode.java:711) at org.hibernate.hql.internal.ast.HqlSqlWalker.resolveSelectExpression(HqlSqlWalker.java:957) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2248) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2185) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1471) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:571) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190) at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1796) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)
|