Code example for SessionImplementor

Methods: afterScrollOperationgetFactory

0
			        "exception calling isAfterLast()" 
				); 
		} 
 
		currentPosition++;
		currentRow = new Object[] { row }; 
 
		if ( afterLast ) {
			if ( maxPosition == null ) {
				// we just hit the last position 
				maxPosition = new Integer( currentPosition );
			} 
		} 
 
		afterScrollOperation(); 
 
		return true; 
	} 
 
	/** 
	 * Retreat to the previous result 
	 * 
	 * @return <tt>true</tt> if there is a previous result 
	 */ 
	public boolean previous() throws HibernateException {
		if ( currentPosition <= 1 ) {
			currentPosition = 0;
			currentRow = null; 
			return false; 
		} 
 
		Object loadResult = getLoader().loadSequentialRowsReverse(
				getResultSet(), 
				getSession(), 
				getQueryParameters(), 
				false, 
		        ( maxPosition != null && currentPosition > maxPosition.intValue() )
		); 
 
		currentRow = new Object[] { loadResult }; 
		currentPosition--;
 
		afterScrollOperation(); 
 
		return true; 
 
	} 
 
	/** 
	 * Scroll an arbitrary number of locations 
	 * 
	 * @param positions a positive (forward) or negative (backward) number of rows 
	 * 
	 * @return <tt>true</tt> if there is a result at the new location 
	 */ 
	public boolean scroll(int positions) throws HibernateException {
		boolean more = false;
		if ( positions > 0 ) {
			// scroll ahead 
			for ( int i = 0; i < positions; i++ ) {
				more = next();
				if ( !more ) {
					break; 
				} 
			} 
		} 
		else if ( positions < 0 ) {
			// scroll backward 
			for ( int i = 0; i < ( 0 - positions ); i++ ) {
				more = previous();
				if ( !more ) {
					break; 
				} 
			} 
		} 
		else { 
			throw new HibernateException( "scroll(0) not valid" );
		} 
 
		afterScrollOperation(); 
 
		return more;
	} 
 
	/** 
	 * Go to the last result 
	 * 
	 * @return <tt>true</tt> if there are any results 
	 */ 
	public boolean last() throws HibernateException {
		boolean more = false;
		if ( maxPosition != null ) {
			if ( currentPosition > maxPosition.intValue() ) {
				more = previous();
			} 
			for ( int i = currentPosition; i < maxPosition.intValue(); i++ ) {
				more = next();
			} 
		} 
		else { 
			try { 
				if ( isResultSetEmpty() || getResultSet().isAfterLast() ) {
					// should not be able to reach last without maxPosition being set 
					// unless there are no results 
					return false; 
				} 
 
				while ( !getResultSet().isAfterLast() ) {
					more = next();
				} 
			} 
			catch( SQLException e ) {
				throw getSession().getFactory().getSQLExceptionHelper().convert(
						e,
						"exception calling isAfterLast()" 
					); 
			} 
		} 
 
		afterScrollOperation(); 
 
		return more;
	} 
 
	/** 
	 * Go to the first result 
	 * 
	 * @return <tt>true</tt> if there are any results 
	 */ 
	public boolean first() throws HibernateException {
		beforeFirst();
		boolean more = next();
 
		afterScrollOperation(); 
 
		return more;
	} 
 
	/** 
	 * Go to a location just before first result (this is the initial location) 
	 */ 
	public void beforeFirst() throws HibernateException {
		try { 
			getResultSet().beforeFirst();
		} 
		catch( SQLException e ) {
			throw getSession().getFactory().getSQLExceptionHelper().convert(
			        e,
			        "exception calling beforeFirst()" 
				); 
		} 
		currentRow = null; 
		currentPosition = 0;
	} 
 
	/** 
	 * Go to a location just after the last result 
	 */ 
	public void afterLast() throws HibernateException {
		// TODO : not sure the best way to handle this. 
		// The non-performant way : 
		last();
		next();
		afterScrollOperation(); 
	} 
 
	/** 
	 * Is this the first result? 
	 * 
	 * @return <tt>true</tt> if this is the first row of results 
	 * 
	 * @throws org.hibernate.HibernateException 
	 */ 
	public boolean isFirst() throws HibernateException {
		return currentPosition == 1;
	} 
 
	/** 
	 * Is this the last result? 
	 * 
	 * @return <tt>true</tt> if this is the last row of results 
	 * 
	 * @throws org.hibernate.HibernateException 
	 */ 
	public boolean isLast() throws HibernateException {
		if ( maxPosition == null ) {
			// we have not yet hit the last result... 
			return false; 
		} 
		else { 
			return currentPosition == maxPosition.intValue();
		} 
	} 
 
	/** 
	 * Get the current location in the result set. The first row is number <tt>0</tt>, contrary to JDBC. 
	 * 
	 * @return the row number, numbered from <tt>0</tt>, or <tt>-1</tt> if there is no current row 
	 */ 
	public int getRowNumber() throws HibernateException {
		return currentPosition;
	} 
 
	/** 
	 * Set the current location in the result set, numbered from either the first row (row number <tt>0</tt>), or the last 
	 * row (row number <tt>-1</tt>). 
	 * 
	 * @param rowNumber the row number, numbered from the last row, in the case of a negative row number