Description:
|
If I use org.hibernate.dialect.SQLServerDialect with SQLServer2008 in order to paginate correctly (see HHH-7752 which was my previous errors, but this time I use a simple @Entity without any @Formula on it), I've got a "The requested operation is not supported on forward only result".
Here is the stack :
ResultSetProxyHandler(AbstractResultSetProxyHandler).continueInvocation(Object, Method, Object[]) line: 104
ResultSetProxyHandler(AbstractProxyHandler).invoke(Object, Method, Object[]) line: 81
$Proxy172.absolute(int) line: not available
QueryLoader(Loader).advance(ResultSet, RowSelection) line: 1651
QueryLoader(Loader).getResultSet(PreparedStatement, boolean, boolean, RowSelection, SessionImplementor) line: 1982
QueryLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean, ResultTransformer) line: 829
QueryLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, boolean, ResultTransformer) line: 289
QueryLoader(Loader).doList(SessionImplementor, QueryParameters, ResultTransformer) line: 2463
QueryLoader(Loader).doList(SessionImplementor, QueryParameters) line: 2449
QueryLoader(Loader).listIgnoreQueryCache(SessionImplementor, QueryParameters) line: 2279
QueryLoader(Loader).list(SessionImplementor, QueryParameters, Set, Type[]) line: 2274
QueryLoader.list(SessionImplementor, QueryParameters) line: 470
QueryTranslatorImpl.list(SessionImplementor, QueryParameters) line: 355
HQLQueryPlan.performList(QueryParameters, SessionImplementor) line: 196
SessionImpl.list(String, QueryParameters) line: 1115
QueryImpl.list() line: 101
QueryImpl<X>.getResultList() line: 252
JPAQuery(AbstractJPAQuery<Q>).getResultList(Query) line: 222
JPAQuery(AbstractJPAQuery<Q>).list(Expression<RT>) line: 274
It seems to be a problem in org.hibernate.loader.Loader because if I put a breakpoint in line 1739 :
st = session.getTransactionCoordinator().getJdbcCoordinator().getStatementPreparer().prepareQueryStatement(
sql,
callable,
scrollMode
);
Here are the values of the variables :
- useLimit : true
- hasFirstRow : true
- useLimitOffset : false
- canScroll : true
- useScrollableResultSetToSkip : true
- scrollMode : null // I think, here it must have been ScrollMode.SCROLL_SENSITIVE
Actually, if I replace the value of scrollMode from null to ScrollMode.SCROLL_SENSITIVE just before the excecution of line 1739, then the error doesn't occure.
So there must be a problem in private ScrollMode getScrollMode(boolean scroll, boolean hasFirstRow, boolean useLimitOffSet, QueryParameters queryParameters) (line 1685) which doesn't use that useScrollableResultSetToSkip variable...
Here it's a problem with SQLServerDialect, but it could be another dialect which would want useScrollableResultSetToSkip to be taken into account (that is to say hasFirstRow = true, useLimit = true, useLimitOffset = false (dialect.supportsLimitOffset = false), getFactory().getSettings().isScrollableResultSetsEnabled() = true), because later getResultSet() method (line 1982) calls advance() method if !dialect.supportsLimitOffset() || !useLimit( selection, dialect ) which will finally call ResultSet.absolute which will throw that exception because the ResultSet wasn't prepared with ScrollMode SENSITIVE.
|