diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java b/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java index 9315964de..51f53eb55 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java @@ -191,6 +191,7 @@ public class CQueryEngine { */ public QueryIterator findIterate(OrmQueryRequest request) { + prepareForPaging(request); CQuery cquery = queryBuilder.buildQuery(request); request.setCancelableQuery(cquery); @@ -326,18 +327,25 @@ public class CQueryEngine { return historySupport.getSysPeriodLower(rootTableAlias); } + /** + * deemed to be a be a paging query - check that the order by contains the id + * property to ensure unique row ordering for predicable paging but only in + * case, this is not a distinct query + * + * @param request + */ + private void prepareForPaging(OrmQueryRequest request) { + SpiQuery query = request.getQuery(); + if (!query.isDistinct() && (query.getMaxRows() > 1 || query.getFirstRow() > 0)) { + request.getBeanDescriptor().appendOrderById(query); + } + } /** * Find a list/map/set of beans. */ BeanCollection findMany(OrmQueryRequest request) { - SpiQuery query = request.getQuery(); - if (!query.isDistinct() && (query.getMaxRows() > 1 || query.getFirstRow() > 0)) { - // deemed to be a be a paging query - check that the order by contains - // the id property to ensure unique row ordering for predicable paging - // but only in case, this is not a distinct query - request.getBeanDescriptor().appendOrderById(query); - } + prepareForPaging(request); CQuery cquery = queryBuilder.buildQuery(request); request.setCancelableQuery(cquery); @@ -376,7 +384,7 @@ public class CQueryEngine { if (cquery != null) { cquery.close(); } - if (query.isFutureFetch()) { + if (request.getQuery().isFutureFetch()) { // end the transaction for futureFindIds // as it had it's own transaction logger.debug("Future fetch completed!"); diff --git a/src/test/java/org/tests/batchload/TestSecondaryQueries.java b/src/test/java/org/tests/batchload/TestSecondaryQueries.java index 50486385b..e853b7119 100644 --- a/src/test/java/org/tests/batchload/TestSecondaryQueries.java +++ b/src/test/java/org/tests/batchload/TestSecondaryQueries.java @@ -12,6 +12,7 @@ import org.ebeantest.LoggedSqlCollector; import org.junit.Assert; import org.junit.Test; +import java.util.Iterator; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -72,6 +73,32 @@ public class TestSecondaryQueries extends BaseTestCase { assertThat(trimSql(sql.get(0), 1)).contains("select t0.id, t0.name from o_customer t0 where t0.id in"); } + + @Test + public void fetchIterate() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + Iterator orders = Ebean.find(Order.class) + .select("status") + .setMaxRows(10) + .setUseCache(false) + .findIterate(); + while (orders.hasNext()) { + orders.next(); // dummy read + } + List sql = LoggedSqlCollector.stop(); + + assertThat(sql).hasSize(1); + if (isSqlServer()) { + assertThat(trimSql(sql.get(0), 2)).contains("select top 10 t0.id, t0.status from o_order t0 order by t0.id"); + } else { + assertThat(trimSql(sql.get(0), 2)).contains("select t0.id, t0.status from o_order t0"); + } + + } @Test public void testSecQueryOneToMany() {