*org.hibernate.query.NativeQuery* created from *org.hibernate.Session::createNativeQuery* used with a *parameterList* and executed with *scroll* (doScroll) is broken.
scroll/doScroll resolves to doScroll in org.hibernate.query.internal.NativeQueryImpl and it appears it fetches the QueryParameters from AbstractProducedQuery::getQueryParameters first, then at a later stage it expands it in QueryParameterBindingImpl::expandListValuedParameters.
scroll with setParameterList works in HQL but seems to be broken in SQL,
* No 1 from *org.hibernate.query.internal.NativeQueryImpl* * {code:java} @Override protected ScrollableResultsImplementor doScroll(ScrollMode scrollMode) { final QueryParameters queryParameters = getQueryParameters(); queryParameters.setScrollMode( scrollMode ); return getProducer().scroll( generateQuerySpecification(), queryParameters ); } {code}
* No 2 from *org.hibernate.query.internal.AbstractProducedQuery* * {code:java} protected ScrollableResultsImplementor doScroll(ScrollMode scrollMode) { final String query = queryParameterBindings.expandListValuedParameters( getQueryString(), getProducer() ); QueryParameters queryParameters = getQueryParameters(); queryParameters.setScrollMode( scrollMode ); return getProducer().scroll( query, queryParameters ); } {code}
(1) calls getQueryParameters but the expand does not happen until in generareQuerySpecification. (2) expandListValuedParameters first and afterwards getQueryParameters.
Code have query table/object User/tUser Field Long id/bigint iUserId
// WORKS {code:java} final ScrollableResults hqlRes = session.createQuery("select u.id from User u where u.id in (:nos)") .setParameterList("nos", Arrays.asList(64L, 84L)) .scroll(ScrollMode.FORWARD_ONLY); while (hqlRes.next()) { final Object[] p = hqlRes.get(); System.out.println(p[0]); } hqlRes.close(); {code}
// BROKEN {code:java} final ScrollableResults sqlRes = session.createNativeQuery("select u.iUserId from tUser u where u.iUserId in (:nos)") .setParameterList("nos", Arrays.asList(64L, 84L)) .scroll(ScrollMode.FORWARD_ONLY); while (sqlRes.next()) { final Object[] p = sqlRes.get(); System.out.println(p[0]); } sqlRes.close(); {code} Results in: Error message: _ERROR 2016-08-10 16:12:25,833 org.hibernate.engine.jdbc.spi.SqlExceptionHelper - No value specified for parameter 1._
This affects scroll which is also used in the stream which was added to Query. |
|