Index: src/net/sf/hibernate/Query.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/Query.java,v retrieving revision 1.17 diff -u -r1.17 Query.java --- src/net/sf/hibernate/Query.java 10 Jun 2004 14:31:54 -0000 1.17 +++ src/net/sf/hibernate/Query.java 3 Sep 2004 04:32:50 -0000 @@ -97,6 +97,17 @@ */ public ScrollableResults scroll() throws HibernateException; /** + * Return the query results as ScrollableResults. The + * scrollability of the returned results depends upon JDBC driver + * support for scrollable ResultSets.
+ * + * @see ScrollableResults + * @see ScrollMode + * @return the result iterator + * @throws HibernateException + */ + public ScrollableResults scroll(ScrollMode scrollMode) throws HibernateException; + /** * Return the query results as a List. If the query contains * multiple results pre row, the results are returned in an instance * of Object[]. Index: src/net/sf/hibernate/engine/Batcher.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/engine/Batcher.java,v retrieving revision 1.10 diff -u -r1.10 Batcher.java --- src/net/sf/hibernate/engine/Batcher.java 4 Jun 2004 01:27:38 -0000 1.10 +++ src/net/sf/hibernate/engine/Batcher.java 3 Sep 2004 04:32:51 -0000 @@ -5,6 +5,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import net.sf.hibernate.ScrollMode; import net.sf.hibernate.HibernateException; @@ -24,7 +25,7 @@ * released by closeQueryStatement(), it will be released when the * session is closed or disconnected. */ - public PreparedStatement prepareQueryStatement(String sql, boolean scrollable) throws SQLException, HibernateException; + public PreparedStatement prepareQueryStatement(String sql, boolean scrollable, ScrollMode scrollMode) throws SQLException, HibernateException; /** * Close a prepared statement opened with prepareQueryStatement() */ Index: src/net/sf/hibernate/engine/QueryParameters.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/engine/QueryParameters.java,v retrieving revision 1.6 diff -u -r1.6 QueryParameters.java --- src/net/sf/hibernate/engine/QueryParameters.java 10 Jun 2004 14:31:54 -0000 1.6 +++ src/net/sf/hibernate/engine/QueryParameters.java 3 Sep 2004 04:32:51 -0000 @@ -10,6 +10,7 @@ import net.sf.hibernate.QueryException; import net.sf.hibernate.impl.Printer; import net.sf.hibernate.type.Type; +import net.sf.hibernate.ScrollMode; /** * @author Gavin King @@ -26,7 +27,8 @@ private boolean cacheable; private String cacheRegion; private boolean forceCacheRefresh; - + private ScrollMode scrollMode; + public QueryParameters(Type[] positionalParameterTypes, Object[] postionalParameterValues) { this(positionalParameterTypes, postionalParameterValues, null, null); } @@ -104,6 +106,14 @@ lockModes = map; } + public ScrollMode getScrollMode() { + return scrollMode; + } + + public void setScrollMode(ScrollMode scrollMode) { + this.scrollMode = scrollMode; + } + public void traceParameters(SessionFactoryImplementor factory) throws HibernateException { Printer print = new Printer(factory); if (positionalParameterValues.length!=0) log.trace( Index: src/net/sf/hibernate/impl/BatcherImpl.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/impl/BatcherImpl.java,v retrieving revision 1.16 diff -u -r1.16 BatcherImpl.java --- src/net/sf/hibernate/impl/BatcherImpl.java 7 Aug 2004 14:05:39 -0000 1.16 +++ src/net/sf/hibernate/impl/BatcherImpl.java 3 Sep 2004 04:32:53 -0000 @@ -8,18 +8,19 @@ import java.util.HashSet; import java.util.Iterator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import net.sf.hibernate.AssertionFailure; import net.sf.hibernate.HibernateException; import net.sf.hibernate.JDBCException; +import net.sf.hibernate.ScrollMode; import net.sf.hibernate.engine.Batcher; import net.sf.hibernate.engine.SessionFactoryImplementor; import net.sf.hibernate.engine.SessionImplementor; import net.sf.hibernate.util.GetGeneratedKeysHelper; import net.sf.hibernate.util.JDBCExceptionReporter; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + /** * Manages prepared statements and batching. * @@ -58,11 +59,11 @@ public PreparedStatement prepareStatement(String sql, boolean getGeneratedKeys) throws SQLException, HibernateException { executeBatch(); logOpenPreparedStatement(); - return getPreparedStatement( session.connection(), sql, false, getGeneratedKeys ); + return getPreparedStatement( session.connection(), sql, false, getGeneratedKeys , null); } - public PreparedStatement prepareQueryStatement(String sql, boolean scrollable) throws SQLException, HibernateException { + public PreparedStatement prepareQueryStatement(String sql, boolean scrollable, ScrollMode scrollMode) throws SQLException, HibernateException { logOpenPreparedStatement(); - PreparedStatement ps = getPreparedStatement( session.connection(), sql, scrollable ); + PreparedStatement ps = getPreparedStatement( session.connection(), sql, scrollable, scrollMode ); setStatementFetchSize(ps); statementsToClose.add(ps); lastQuery=ps; @@ -227,12 +228,12 @@ if ( factory.isShowSqlEnabled() ) System.out.println("Hibernate: " + sql); } - private PreparedStatement getPreparedStatement(final Connection conn, final String sql, boolean scrollable) + private PreparedStatement getPreparedStatement(final Connection conn, final String sql, boolean scrollable, ScrollMode scrollMode) throws SQLException { - return getPreparedStatement(conn, sql, scrollable, false); + return getPreparedStatement(conn, sql, scrollable, false, scrollMode); } - private PreparedStatement getPreparedStatement(final Connection conn, final String sql, boolean scrollable, boolean useGetGeneratedKeys) + private PreparedStatement getPreparedStatement(final Connection conn, final String sql, boolean scrollable, boolean useGetGeneratedKeys, ScrollMode scrollMode) throws SQLException { if ( scrollable && !factory.isScrollableResultSetsEnabled() ) { @@ -248,7 +249,9 @@ try { log.trace("preparing statement"); if (scrollable) { - return conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + if(scrollMode == null) + scrollMode = ScrollMode.SCROLL_INSENSITIVE; + return conn.prepareStatement(sql, scrollMode.toResultSetType(), ResultSet.CONCUR_READ_ONLY); } else if (useGetGeneratedKeys) { return GetGeneratedKeysHelper.prepareStatement(conn, sql); Index: src/net/sf/hibernate/impl/QueryImpl.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/impl/QueryImpl.java,v retrieving revision 1.23 diff -u -r1.23 QueryImpl.java --- src/net/sf/hibernate/impl/QueryImpl.java 4 Jun 2004 01:27:41 -0000 1.23 +++ src/net/sf/hibernate/impl/QueryImpl.java 3 Sep 2004 04:32:53 -0000 @@ -5,6 +5,10 @@ import java.util.List; import java.util.Map; +import net.sf.hibernate.FlushMode; +import net.sf.hibernate.ScrollMode; +import net.sf.hibernate.engine.QueryParameters; + import net.sf.hibernate.HibernateException; import net.sf.hibernate.ScrollableResults; import net.sf.hibernate.engine.SessionImplementor; @@ -32,6 +36,14 @@ Map namedParams = getNamedParams(); return getSession().scroll( bindParameterLists(namedParams), getQueryParameters(namedParams) ); } + + public ScrollableResults scroll(ScrollMode scrollMode) throws HibernateException { + verifyParameters(); + Map namedParams = getNamedParams(); + QueryParameters qp = getQueryParameters(namedParams); + qp.setScrollMode(scrollMode); + return getSession().scroll( bindParameterLists(namedParams), qp); + } public List list() throws HibernateException { verifyParameters(); Index: src/net/sf/hibernate/impl/SQLQueryImpl.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/impl/SQLQueryImpl.java,v retrieving revision 1.5 diff -u -r1.5 SQLQueryImpl.java --- src/net/sf/hibernate/impl/SQLQueryImpl.java 4 Jun 2004 01:27:41 -0000 1.5 +++ src/net/sf/hibernate/impl/SQLQueryImpl.java 3 Sep 2004 04:32:53 -0000 @@ -11,7 +11,7 @@ import net.sf.hibernate.ScrollableResults; import net.sf.hibernate.engine.SessionImplementor; import net.sf.hibernate.type.Type; - +import net.sf.hibernate.ScrollMode; /** * Implements SQL query passthrough. * @@ -59,6 +59,9 @@ public ScrollableResults scroll() throws HibernateException { throw new UnsupportedOperationException("SQL queries do not currently support iteration"); } + public ScrollableResults scroll(ScrollMode scrollMode) throws HibernateException{ + throw new UnsupportedOperationException("SQL queries do not currently support iteration"); + } public Type[] getReturnTypes() throws HibernateException { Type[] types = new Type[returnClasses.length]; Index: src/net/sf/hibernate/loader/Loader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader/Loader.java,v retrieving revision 1.44 diff -u -r1.44 Loader.java --- src/net/sf/hibernate/loader/Loader.java 8 Aug 2004 10:12:23 -0000 1.44 +++ src/net/sf/hibernate/loader/Loader.java 3 Sep 2004 04:32:56 -0000 @@ -35,6 +35,7 @@ import net.sf.hibernate.util.StringHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import net.sf.hibernate.ScrollMode; /** * Abstract superclass of object loading (and querying) strategies. This class implements @@ -773,10 +774,11 @@ scroll || //ie. a query called using scroll() ( hasFirstRow && !useOffset ) //we want to skip some rows at the start ); + ScrollMode scrollMode = scroll ? queryParameters.getScrollMode() : ScrollMode.SCROLL_INSENSITIVE; if (useLimit) sql = dialect.getLimitString( sql.trim(), useOffset, getMaxOrLimit(selection, dialect) ); - PreparedStatement st = session.getBatcher().prepareQueryStatement(sql, scrollable); + PreparedStatement st = session.getBatcher().prepareQueryStatement(sql, scrollable, scrollMode); try { Index: src/net/sf/hibernate/persister/AbstractEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/AbstractEntityPersister.java,v retrieving revision 1.43 diff -u -r1.43 AbstractEntityPersister.java --- src/net/sf/hibernate/persister/AbstractEntityPersister.java 16 Aug 2004 21:57:53 -0000 1.43 +++ src/net/sf/hibernate/persister/AbstractEntityPersister.java 3 Sep 2004 04:32:59 -0000 @@ -1254,7 +1254,7 @@ Object[] values = new Object[ types.length ]; boolean[] includeProperty = getPropertyUpdateability(); try { - PreparedStatement ps = session.getBatcher().prepareQueryStatement( getConcreteSelectString(), false ); + PreparedStatement ps = session.getBatcher().prepareQueryStatement( getConcreteSelectString(), false, null ); ResultSet rs = null; try { getIdentifierType().nullSafeSet(ps, id, 1, session); Index: src/net/sf/hibernate/ScrollMode.java =================================================================== RCS file: src/net/sf/hibernate/ScrollMode.java diff -N src/net/sf/hibernate/ScrollMode.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/net/sf/hibernate/ScrollMode.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,74 @@ +//$Id: ScrollMode.java,v 1.1 2004/08/18 00:28:35 oneovthafew Exp $ +package net.sf.hibernate; + +import java.io.Serializable; +import java.sql.ResultSet; +import java.util.HashMap; +import java.util.Map; + +/** + * Specifies the type of JDBC scrollable result set to use + * underneath a ScrollableResults + * + * @see Query#scroll(ScrollMode) + * @see ScrollableResults + * @author Gavin King + */ +public final class ScrollMode implements Serializable { + private final int resultSetType; + private final String name; + private static final Map INSTANCES = new HashMap(); + + private ScrollMode(int level, String name) { + this.resultSetType=level; + this.name=name; + } + + public String toString() { + return name; + } + + /** + * @return the JDBC result set type code + */ + public int toResultSetType() { + return resultSetType; + } + + /** + * @see java.sql.ResultSet.TYPE_FORWARD_ONLY + */ + public static final ScrollMode FORWARD_ONLY = new ScrollMode(ResultSet.TYPE_FORWARD_ONLY, "FORWARD_ONLY"); + /** + * @see java.sql.ResultSet.TYPE_SCROLL_SENSITIVE + */ + public static final ScrollMode SCROLL_SENSITIVE = new ScrollMode(ResultSet.TYPE_SCROLL_SENSITIVE, "SCROLL_SENSITIVE"); + /** + * Note that since the Hibernate session acts as a cache, you + * might need to expicitly evict objects, if you need to see + * changes made by other transactions. + * @see java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE + */ + public static final ScrollMode SCROLL_INSENSITIVE = new ScrollMode(ResultSet.TYPE_SCROLL_INSENSITIVE, "SCROLL_INSENSITIVE"); + + public boolean lessThan(ScrollMode other) { + return this.resultSetType