Issue Type: Bug Bug
Affects Versions: 4.0.1
Assignee: Unassigned
Components: core
Created: 04/Nov/12 5:46 PM
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.

Environment: JBoss 7.1.1.Final, SQLServer 2008 R2
Project: Hibernate ORM
Labels: sqlserver pagination core
Priority: Blocker Blocker
Reporter: Anthony Ogier
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira