| Consider the following code:
final Query q = session.createQuery("select e from com.example.bugdemonstrator.entities.E1 e inner join fetch e.items where e.id IN :ids");
q.setParameterList("ids", Stream.of(0L,1L,2L,3L).collect(Collectors.toList()));
System.out.println(q.list());
q.setParameterList("ids", Stream.of(4L,5L).collect(Collectors.toList()));
System.out.println(q.list());
It is interrupted with NPE on the second q.list(). This is because QueryParameterBindingImpl doesn't clean parameterBindingMap between executions. The problem occurs only if query has subselects (more precisely when createSubselects in org.hibernate.loader.Loader#processResultSet evaluates to true). Method org.hibernate.loader.Loader#createSubselects iterates over parameter bindings from the previous execution of a query, doesn't find them and throws NPE. side note: method org.hibernate.hql.internal.ast.ParameterTranslationsImpl#getNamedParameterInfo should log debug info when parameter name not found. Steps to reproduce with attached tarball:
- unpack
- mvn spring-boot:run
Stacktrace:
Caused by: java.lang.NullPointerException
at org.hibernate.hql.internal.ast.ParameterTranslationsImpl.getNamedParameterSqlLocations(ParameterTranslationsImpl.java:68)
at org.hibernate.loader.hql.QueryLoader.getNamedParameterLocs(QueryLoader.java:602)
at org.hibernate.loader.Loader.buildNamedParameterLocMap(Loader.java:1101)
at org.hibernate.loader.Loader.createSubselects(Loader.java:1064)
at org.hibernate.loader.Loader.processResultSet(Loader.java:1029)
at org.hibernate.loader.Loader.doQuery(Loader.java:959)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:351)
at org.hibernate.loader.Loader.doList(Loader.java:2702)
at org.hibernate.loader.Loader.doList(Loader.java:2685)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2517)
at org.hibernate.loader.Loader.list(Loader.java:2512)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:384)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1490)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
at com.example.bugdemonstrator.BugDemonstratorApplication.run(BugDemonstratorApplication.java:61)
at com.example.bugdemonstrator.BugDemonstratorApplication$$FastClassBySpringCGLIB$$de226c0f.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.example.bugdemonstrator.BugDemonstratorApplication$$EnhancerBySpringCGLIB$$bed30d97.run(<generated>)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:732)
... 12 more
|