| Hibernate 5.3.0.Beta2 fail to handle JPQL positional queries if there is one "scalar" parameter and one "collection" with more than one element. For example:
select item from Item item where item.name in ?1 and descr = ?2
throws:
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Cannot define positional and named parameterSpecs : select item from org.hibernate.jpa.test.Item item where item.name in (:x1_0, :x1_1) and descr = ?2 [select item from org.hibernate.jpa.test.Item item where item.name in (:x1_0, :x1_1) and descr = ?2]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:133)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1511)
at org.hibernate.query.Query.getResultList(Query.java:146)
at org.hibernate.jpa.test.query.QueryTest.testParameterListAndPositionnal(QueryTest.java:731)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.hibernate.testing.junit4.ExtendedFrameworkMethod.invokeExplosively(ExtendedFrameworkMethod.java:45)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Cannot define positional and named parameterSpecs : select item from org.hibernate.jpa.test.Item item where item.name in (:x1_0, :x1_1) and descr = ?2 [select item from org.hibernate.jpa.test.Item item where item.name in (:x1_0, :x1_1) and descr = ?2]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:277)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:120)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:81)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:560)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1484)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1534)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1502)
... 17 more
This query used to work with Hibernate 5.2.x (including 5.2.13). This query is also broken (with parentheses around ?1), but only if there is more than one element in the collection parameter:
select item from Item item where item.name in (?1) and descr = ?2
I'm working on a test-case based on the hibernate codebase. Github branch incoming. |