useScrollableResultSetToSkip not used

Description

If I use org.hibernate.dialect.SQLServerDialect with SQLServer2008 in order to paginate correctly (see 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 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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 :

1 2 3 4 5 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.

Environment

JBoss 7.1.1.Final, SQLServer 2008 R2

Status

Assignee

Unassigned

Reporter

Anthony Ogier

Fix versions

None

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Components

Affects versions

4.0.1

Priority

Blocker
Configure