[hibernate-commits] Hibernate SVN: r19217 - in core/trunk: testsuite/src/test/java/org/hibernate/test/hql and 1 other directory.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Mon Apr 12 14:21:12 EDT 2010
Author: gbadner
Date: 2010-04-12 14:21:12 -0400 (Mon, 12 Apr 2010)
New Revision: 19217
Modified:
core/trunk/core/src/main/java/org/hibernate/impl/FetchingScrollableResultsImpl.java
core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java
Log:
HHH-1804 HHH-5096 : FetchingScrollableResultsImpl throws SQLException when empty; last() does not move cursor if it is after last
Modified: core/trunk/core/src/main/java/org/hibernate/impl/FetchingScrollableResultsImpl.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/impl/FetchingScrollableResultsImpl.java 2010-04-12 18:20:20 UTC (rev 19216)
+++ core/trunk/core/src/main/java/org/hibernate/impl/FetchingScrollableResultsImpl.java 2010-04-12 18:21:12 UTC (rev 19217)
@@ -75,6 +75,12 @@
return false;
}
+ if ( isResultSetEmpty() ) {
+ currentRow = null;
+ currentPosition = 0;
+ return false;
+ }
+
Object row = getLoader().loadSequentialRowsForward(
getResultSet(),
getSession(),
@@ -183,13 +189,16 @@
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 ( getResultSet().isAfterLast() ) {
+ if ( isResultSetEmpty() || getResultSet().isAfterLast() ) {
// should not be able to reach last without maxPosition being set
// unless there are no results
return false;
@@ -313,4 +322,18 @@
}
return scroll( rowNumber - currentPosition );
}
+
+ private boolean isResultSetEmpty() {
+ try {
+ return currentPosition == 0 && ! getResultSet().isBeforeFirst() && ! getResultSet().isAfterLast();
+ }
+ catch( SQLException e ) {
+ throw JDBCExceptionHelper.convert(
+ getSession().getFactory().getSQLExceptionConverter(),
+ e,
+ "Could not determine if resultset is empty due to exception calling isBeforeFirst or isAfterLast()"
+ );
+ }
+ }
+
}
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java 2010-04-12 18:20:20 UTC (rev 19216)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ScrollableCollectionFetchingTest.java 2010-04-12 18:21:12 UTC (rev 19217)
@@ -1,6 +1,8 @@
// $Id: ScrollableCollectionFetchingTest.java 10977 2006-12-12 23:28:04Z steve.ebersole at jboss.com $
package org.hibernate.test.hql;
+import java.util.List;
+
import junit.framework.Test;
import org.hibernate.HibernateException;
@@ -47,6 +49,195 @@
s.close();
}
+ public void testScrollingJoinFetchesEmptyResultSet() {
+ Session s = openSession();
+ Transaction txn = s.beginTransaction();
+
+ assertTrue(s
+ .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+ .setString( "desc", "root%" )
+ .list()
+ .isEmpty() );
+
+ ScrollableResults results = s
+ .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+ .setString( "desc", "root%" )
+ .scroll();
+
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertFalse( results.next() );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertFalse( results.previous() );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ results.beforeFirst();
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ assertFalse( results.next() );
+
+ assertFalse( results.first() );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ assertFalse( results.next() );
+
+ results.afterLast();
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ assertFalse( results.next() );
+
+ assertFalse( results.last() );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ assertFalse( results.next() );
+
+ for ( int i=1; i<3; i++ ) {
+ assertFalse( results.scroll( i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertFalse( results.scroll( - i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertFalse( results.setRowNumber( i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertFalse( results.setRowNumber( - i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ }
+
+ txn.commit();
+ s.close();
+ }
+
+ public void testScrollingJoinFetchesSingleRowResultSet() {
+ Session s = openSession();
+ Transaction txn = s.beginTransaction();
+
+ Animal mother = new Animal();
+ mother.setDescription( "root-1" );
+
+ Animal daughter = new Animal();
+ daughter.setDescription( "daughter" );
+
+ daughter.setMother( mother );
+ mother.addOffspring( daughter );
+
+ s.save( mother );
+ s.save( daughter );
+
+ txn.commit();
+ s.close();
+
+ s = openSession();
+ txn = s.beginTransaction();
+
+ assertNotNull(s
+ .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+ .setString( "desc", "root%" )
+ .uniqueResult() );
+
+ ScrollableResults results = s
+ .createQuery( "from Animal a left join fetch a.offspring where a.description like :desc order by a.id" )
+ .setString( "desc", "root%" )
+ .scroll();
+
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ assertFalse( results.previous() );
+
+ assertTrue( results.next() );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+
+ assertFalse( results.next() );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertTrue( results.previous() );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+
+ assertFalse( results.previous() );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertTrue( results.next() );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+
+ results.beforeFirst();
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ assertFalse( results.previous() );
+
+ assertTrue( results.first() );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+ assertFalse( results.next() );
+
+ results.afterLast();
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ assertFalse( results.next() );
+
+ assertTrue( results.last() );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+ assertFalse( results.next() );
+
+ assertTrue( results.first() );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+
+ for ( int i=1; i<3; i++ ) {
+ assertTrue( results.setRowNumber( 1 ) );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+
+ assertFalse( results.scroll( i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertTrue( results.setRowNumber( 1 ) );
+ assertTrue( results.isFirst() );
+ assertTrue( results.isLast() );
+
+ assertFalse( results.scroll( - i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ if ( i != 1 ) {
+ assertFalse( results.setRowNumber( i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+
+ assertFalse( results.setRowNumber( - i ) );
+ assertFalse( results.isFirst() );
+ assertFalse( results.isLast() );
+ }
+ }
+
+ txn.commit();
+ s.close();
+
+ s = openSession();
+ txn = s.beginTransaction();
+
+ s.createQuery( "delete Animal where not description like 'root%'" ).executeUpdate();
+ s.createQuery( "delete Animal" ).executeUpdate();
+
+ txn.commit();
+ s.close();
+ }
+
public void testScrollingJoinFetchesForward() {
if ( ! supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() ) {
return;
More information about the hibernate-commits
mailing list