diff --git a/src/main/java/com/avaje/ebean/bean/BeanCollection.java b/src/main/java/com/avaje/ebean/bean/BeanCollection.java index ededeabc4..1f3980396 100644 --- a/src/main/java/com/avaje/ebean/bean/BeanCollection.java +++ b/src/main/java/com/avaje/ebean/bean/BeanCollection.java @@ -137,22 +137,6 @@ public interface BeanCollection extends Serializable { */ public Collection getActualEntries(); - /** - * Set to true if maxRows was hit and there are actually more rows available. - *

- * Can be used by client code that is paging through results using - * setFirstRow() setMaxRows(). If this returns true then the client can - * display a 'next' button etc. - *

- */ - public boolean hasMoreRows(); - - /** - * Set to true when maxRows is hit but there are actually more rows available. - * This is set so that client code knows that there is more data available. - */ - public void setHasMoreRows(boolean hasMoreRows); - /** * return true if there are real rows held. Return false is this is using * Deferred fetch to lazy load the rows and the rows have not yet been diff --git a/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java b/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java index 484909963..a5b110402 100644 --- a/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java +++ b/src/main/java/com/avaje/ebean/common/AbstractBeanCollection.java @@ -45,12 +45,6 @@ public abstract class AbstractBeanCollection implements BeanCollection { */ protected final String propertyName; - /** - * Flag set to true if rows are limited by firstRow maxRows and more rows - * exist. For use by client to enable 'next' for paging. - */ - protected boolean hasMoreRows; - protected ModifyHolder modifyHolder; protected ModifyListenMode modifyListenMode; @@ -151,26 +145,6 @@ public abstract class AbstractBeanCollection implements BeanCollection { this.readOnly = readOnly; } - /** - * Set to true if maxRows was hit and there are actually more rows available. - *

- * Can be used by client code that is paging through results using - * setFirstRow() setMaxRows(). If this returns true then the client can - * display a 'next' button etc. - *

- */ - public boolean hasMoreRows() { - return hasMoreRows; - } - - /** - * Set to true when maxRows is hit but there are actually more rows available. - * This is set so that client code knows that there is more data available. - */ - public void setHasMoreRows(boolean hasMoreRows) { - this.hasMoreRows = hasMoreRows; - } - protected void checkReadOnly() { if (readOnly) { String msg = "This collection is in ReadOnly mode"; diff --git a/src/main/java/com/avaje/ebean/common/BeanList.java b/src/main/java/com/avaje/ebean/common/BeanList.java index b70325e3e..4ebb821e7 100644 --- a/src/main/java/com/avaje/ebean/common/BeanList.java +++ b/src/main/java/com/avaje/ebean/common/BeanList.java @@ -153,7 +153,7 @@ public final class BeanList extends AbstractBeanCollection implements List } public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuffer sb = new StringBuffer(50); sb.append("BeanList "); if (isReadOnly()) { sb.append("readOnly "); @@ -163,7 +163,6 @@ public final class BeanList extends AbstractBeanCollection implements List } else { sb.append("size[").append(list.size()).append("] "); - sb.append("hasMoreRows[").append(hasMoreRows).append("] "); sb.append("list").append(list).append(""); } return sb.toString(); diff --git a/src/main/java/com/avaje/ebean/common/BeanMap.java b/src/main/java/com/avaje/ebean/common/BeanMap.java index 5c97d0991..754be731a 100644 --- a/src/main/java/com/avaje/ebean/common/BeanMap.java +++ b/src/main/java/com/avaje/ebean/common/BeanMap.java @@ -154,7 +154,7 @@ public final class BeanMap extends AbstractBeanCollection implements Ma } public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuffer sb = new StringBuffer(50); sb.append("BeanMap "); if (isReadOnly()) { sb.append("readOnly "); @@ -164,7 +164,6 @@ public final class BeanMap extends AbstractBeanCollection implements Ma } else { sb.append("size[").append(map.size()).append("]"); - sb.append(" hasMoreRows[").append(hasMoreRows).append("]"); sb.append(" map").append(map); } return sb.toString(); diff --git a/src/main/java/com/avaje/ebean/common/BeanSet.java b/src/main/java/com/avaje/ebean/common/BeanSet.java index 78da3941a..f4cddde29 100644 --- a/src/main/java/com/avaje/ebean/common/BeanSet.java +++ b/src/main/java/com/avaje/ebean/common/BeanSet.java @@ -143,7 +143,7 @@ public final class BeanSet extends AbstractBeanCollection implements Set extends AbstractBeanCollection implements Set 0) { - maxRows = maxRows + 1; - } if (maxRows > 0 || firstRow > 0) { - sb.append(" ").append(NEW_LINE).append(LIMIT).append(" ").append(maxRows); + sb.append(" ").append(LIMIT).append(" ").append(maxRows); if (firstRow > 0) { sb.append(" ").append(OFFSET).append(" "); sb.append(firstRow); diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/MsSqlServer2005SqlLimiter.java b/src/main/java/com/avaje/ebean/config/dbplatform/MsSqlServer2005SqlLimiter.java index 0e25425ca..e1c7411f6 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/MsSqlServer2005SqlLimiter.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/MsSqlServer2005SqlLimiter.java @@ -26,9 +26,7 @@ public class MsSqlServer2005SqlLimiter implements SqlLimiter { int lastRow = request.getMaxRows(); if (lastRow > 0) { - // fetch 1 more than we return so that - // we know if more rows are available - lastRow = lastRow + firstRow + 1; + lastRow = lastRow + firstRow; } if (firstRow < 1) { diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/RowNumberSqlLimiter.java b/src/main/java/com/avaje/ebean/config/dbplatform/RowNumberSqlLimiter.java index 15571be28..bd46b3831 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/RowNumberSqlLimiter.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/RowNumberSqlLimiter.java @@ -15,7 +15,7 @@ public class RowNumberSqlLimiter implements SqlLimiter { */ private static final String ROW_NUMBER_AS = ") as rn, "; - final String rowNumberWindowAlias; + private final String rowNumberWindowAlias; /** * Specify the name of the rowNumberWindowAlias. @@ -30,16 +30,18 @@ public class RowNumberSqlLimiter implements SqlLimiter { public SqlLimitResponse limit(SqlLimitRequest request) { - StringBuilder sb = new StringBuilder(500); + String dbSql = request.getDbSql(); + + StringBuilder sb = new StringBuilder(60 + dbSql.length()); int firstRow = request.getFirstRow(); int lastRow = request.getMaxRows(); if (lastRow > 0) { - lastRow = lastRow + firstRow + 1; + lastRow = lastRow + firstRow; } - sb.append("select * from (").append(NEW_LINE); + sb.append("select * from ( "); sb.append("select "); if (request.isDistinct()) { @@ -50,9 +52,9 @@ public class RowNumberSqlLimiter implements SqlLimiter { sb.append(request.getDbOrderBy()); sb.append(ROW_NUMBER_AS); - sb.append(request.getDbSql()); + sb.append(dbSql); - sb.append(NEW_LINE).append(") "); + sb.append(" ) "); sb.append(rowNumberWindowAlias); sb.append(" where "); if (firstRow > 0) { diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/RownumSqlLimiter.java b/src/main/java/com/avaje/ebean/config/dbplatform/RownumSqlLimiter.java index d62e392ca..71fb5c99d 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/RownumSqlLimiter.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/RownumSqlLimiter.java @@ -35,38 +35,40 @@ public class RownumSqlLimiter implements SqlLimiter { // :MAX_ROW_TO_FETCH ) // where rnum >= :MIN_ROW_TO_FETCH; - StringBuilder sb = new StringBuilder(500); + String dbSql = request.getDbSql(); + + StringBuilder sb = new StringBuilder(60 + dbSql.length()); int firstRow = request.getFirstRow(); int lastRow = request.getMaxRows(); if (lastRow > 0) { - lastRow = lastRow + firstRow + 1; + lastRow = lastRow + firstRow; } - sb.append("select * ").append(NEW_LINE).append("from ( "); + sb.append("select * from ( "); sb.append("select "); if (useFirstRowsHint && request.getMaxRows() > 0) { - sb.append("/*+ FIRST_ROWS(").append(request.getMaxRows() + 1).append(") */ "); + sb.append("/*+ FIRST_ROWS(").append(request.getMaxRows()).append(") */ "); } - sb.append("rownum ").append(rnum).append(", a.* ").append(NEW_LINE); - sb.append(" from (");// + sb.append("rownum ").append(rnum).append(", a.* "); + sb.append(" from ("); sb.append(" select "); if (request.isDistinct()) { sb.append("distinct "); } - sb.append(request.getDbSql()); + sb.append(dbSql); - sb.append(NEW_LINE).append(" ) a "); + sb.append(NEW_LINE).append(" ) a "); if (lastRow > 0) { - sb.append(NEW_LINE).append(" where rownum <= ").append(lastRow); + sb.append(" where rownum <= ").append(lastRow); } - sb.append(NEW_LINE).append(" ) "); + sb.append(" ) "); if (firstRow > 0) { - sb.append(NEW_LINE).append("where "); + sb.append(" where "); sb.append(rnum).append(" > ").append(firstRow); } diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/SqlAnywhereLimiter.java b/src/main/java/com/avaje/ebean/config/dbplatform/SqlAnywhereLimiter.java index fcdd5bc6f..b5ae7f56f 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/SqlAnywhereLimiter.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/SqlAnywhereLimiter.java @@ -8,15 +8,12 @@ public class SqlAnywhereLimiter implements SqlLimiter { public SqlLimitResponse limit(SqlLimitRequest request) { - StringBuilder sb = new StringBuilder(500); + String dbSql = request.getDbSql(); + + StringBuilder sb = new StringBuilder(60 + dbSql.length()); int firstRow = request.getFirstRow(); int maxRows = request.getMaxRows(); - if (maxRows > 0) { - // fetch 1 more than we return so that - // we know if more rows are available - maxRows = maxRows + 1; - } /* * SELECT TOP xx START AT xx ... FROM ... @@ -31,7 +28,7 @@ public class SqlAnywhereLimiter implements SqlLimiter { if (firstRow > 0) { sb.append("start at ").append(firstRow + 1).append(" "); } - sb.append(request.getDbSql()); + sb.append(dbSql); String sql = request.getDbPlatform().completeSql(sb.toString(), request.getOrmQuery()); diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/SqlLimitRequest.java b/src/main/java/com/avaje/ebean/config/dbplatform/SqlLimitRequest.java index 9a0e55264..a97d972f1 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/SqlLimitRequest.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/SqlLimitRequest.java @@ -5,8 +5,6 @@ import com.avaje.ebean.Query; /** * The request object for the query that can have sql limiting applied to it * (such as a LIMIT OFFSET clause). - * - * @author rob */ public interface SqlLimitRequest { diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java index 3666ff6f5..218940be3 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java @@ -476,15 +476,6 @@ public class CQuery implements DbReadContext, CancelableQuery { } } - private boolean hasMoreRows() throws SQLException { - synchronized (this) { - if (cancelled) { - return false; - } - return dataReader.next(); - } - } - /** * Read a row from the result set returning a bean. *

@@ -533,7 +524,6 @@ public class CQuery implements DbReadContext, CancelableQuery { private boolean readBeanInternal() throws SQLException { if (loadedBeanCount >= maxRowsLimit) { - collection.setHasMoreRows(hasMoreRows()); return false; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java index 05a58bb37..07f269ae0 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java @@ -125,6 +125,10 @@ public class CQueryBuilder implements Constants { // always set the order by to null for row count query query.setOrder(null); + if (query.isRawSql()) { + query.setFirstRow(0); + query.setMaxRows(0); + } ManyWhereJoins manyWhereJoins = query.getManyWhereJoins(); @@ -158,7 +162,7 @@ public class CQueryBuilder implements Constants { SqlTree sqlTree = createSqlTree(request, predicates); SqlLimitResponse s = buildSql(sqlSelect, request, predicates, sqlTree); String sql = s.getSql(); - if (hasMany) { + if (hasMany || query.isRawSql()) { sql = "select count(*) from ( " + sql + ")"; if (selectCountWithAlias) { sql += " as c"; diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java index b4817f24f..b7a9eaa63 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultRelationalQueryEngine.java @@ -115,8 +115,6 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { maxRows = query.getMaxRows(); } - boolean hasHitMaxRows = false; - int loadRowCount = 0; SqlQueryListener listener = query.getListener(); @@ -152,7 +150,6 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { if (loadRowCount == maxRows) { // break, as we have hit the max rows to fetch... - hasHitMaxRows = true; break; } } @@ -160,13 +157,6 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { BeanCollection beanColl = wrapper.getBeanCollection(); - if (hasHitMaxRows) { - if (rset.next()) { - // there are more rows available after the maxRows limit - beanColl.setHasMoreRows(true); - } - } - if (request.isLogSummary()) { long exeTime = System.currentTimeMillis() - startTime; String msg = "SqlQuery rows[" + loadRowCount + "] time[" + exeTime + "] bind[" + bindLog + "]"; diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/LimitOffsetPage.java b/src/main/java/com/avaje/ebeaninternal/server/query/LimitOffsetPage.java index 26f889e48..a18f60463 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/LimitOffsetPage.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/LimitOffsetPage.java @@ -52,7 +52,7 @@ public class LimitOffsetPage implements Page, BeanCollectionTouched { * Perform fetch ahead when the list is first accessed. */ public void notifyTouched(BeanCollection c) { - if (c.hasMoreRows()) { + if (hasNext()) { owner.fetchAheadIfRequired(pageIndex); } } @@ -65,9 +65,8 @@ public class LimitOffsetPage implements Page, BeanCollectionTouched { } } - @SuppressWarnings("unchecked") public boolean hasNext() { - return ((BeanCollection) getList()).hasMoreRows(); + return pageIndex < getTotalPageCount() - 1; } public boolean hasPrev() { diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java index 3db79733e..70b478666 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryLimitRequest.java @@ -6,12 +6,13 @@ import com.avaje.ebeaninternal.api.SpiQuery; public class OrmQueryLimitRequest implements SqlLimitRequest { - final SpiQuery ormQuery; - final DatabasePlatform dbPlatform; - - final String sql; + private final SpiQuery ormQuery; - final String sqlOrderBy; + private final DatabasePlatform dbPlatform; + + private final String sql; + + private final String sqlOrderBy; public OrmQueryLimitRequest(String sql, String sqlOrderBy, SpiQuery ormQuery, DatabasePlatform dbPlatform) { this.sql = sql; diff --git a/src/test/java/com/avaje/tests/basic/TestLimitQuery.java b/src/test/java/com/avaje/tests/basic/TestLimitQuery.java index ed3141076..94401d008 100644 --- a/src/test/java/com/avaje/tests/basic/TestLimitQuery.java +++ b/src/test/java/com/avaje/tests/basic/TestLimitQuery.java @@ -2,8 +2,7 @@ package com.avaje.tests.basic; import java.util.List; -import junit.framework.Assert; - +import org.junit.Assert; import org.junit.Test; import com.avaje.ebean.BaseTestCase; @@ -41,7 +40,7 @@ public class TestLimitQuery extends BaseTestCase { .setMaxRows(0) .setFirstRow(3); - List list = query.findList(); + query.findList(); String sql = query.getGeneratedSql(); boolean hasLimit = sql.indexOf("limit 0") > -1; @@ -67,10 +66,10 @@ public class TestLimitQuery extends BaseTestCase { .setMaxRows(3) .setFirstRow(0); - List list = query.findList(); + query.findList(); String sql = query.getGeneratedSql(); - boolean hasLimit = sql.indexOf("limit 4") > -1; + boolean hasLimit = sql.indexOf("limit 3") > -1; boolean hasOffset = sql.indexOf("offset") > -1; if (h2Db) { @@ -92,7 +91,7 @@ public class TestLimitQuery extends BaseTestCase { .where().gt("details.id", 0) .query(); - List list = query.findList(); + query.findList(); String sql = query.getGeneratedSql(); boolean hasLimit = sql.indexOf("limit") > -1; @@ -123,7 +122,7 @@ public class TestLimitQuery extends BaseTestCase { String sql = query.getGeneratedSql(); boolean hasDetailsJoin = sql.indexOf("join o_order_detail") > -1; - boolean hasLimit = sql.indexOf("limit 11") > -1; + boolean hasLimit = sql.indexOf("limit 10") > -1; boolean hasSelectedDetails = sql.indexOf("od.id,") > -1; boolean hasDistinct = sql.indexOf("select distinct") > -1; @@ -143,7 +142,7 @@ public class TestLimitQuery extends BaseTestCase { sql = query.getGeneratedSql(); hasDetailsJoin = sql.indexOf("left outer join o_order_detail") > -1; - hasLimit = sql.indexOf("limit 11") > -1; + hasLimit = sql.indexOf("limit 10") > -1; hasSelectedDetails = sql.indexOf("od.id") > -1; hasDistinct = sql.indexOf("select distinct") > -1; diff --git a/src/test/java/com/avaje/tests/query/other/TestFindPagedList.java b/src/test/java/com/avaje/tests/query/other/TestFindPagedList.java index 367ed63a6..23f965b1a 100644 --- a/src/test/java/com/avaje/tests/query/other/TestFindPagedList.java +++ b/src/test/java/com/avaje/tests/query/other/TestFindPagedList.java @@ -10,7 +10,9 @@ import org.junit.Test; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.EbeanServer; +import com.avaje.ebean.Page; import com.avaje.ebean.PagedList; +import com.avaje.ebean.PagingList; import com.avaje.ebean.Transaction; import com.avaje.tests.model.basic.EBasic; @@ -37,6 +39,17 @@ public class TestFindPagedList extends BaseTestCase { transaction.end(); } + @SuppressWarnings("deprecation") + PagingList pagingList = Ebean.find(EBasic.class) + .where().like("name", "HelloB0B%") + .findPagingList(10); + + Page page7 = pagingList.getPage(7); + Assert.assertTrue(page7.hasNext()); + + Page page8 = pagingList.getPage(8); + Assert.assertFalse(page8.hasNext()); + PagedList page1 = Ebean.find(EBasic.class) .where().like("name", "HelloB0B%") .findPagedList(0, 10); diff --git a/src/test/java/com/avaje/tests/rawsql/TestRawSqlOrmQuery.java b/src/test/java/com/avaje/tests/rawsql/TestRawSqlOrmQuery.java index f842622e2..47b646247 100644 --- a/src/test/java/com/avaje/tests/rawsql/TestRawSqlOrmQuery.java +++ b/src/test/java/com/avaje/tests/rawsql/TestRawSqlOrmQuery.java @@ -1,6 +1,7 @@ package com.avaje.tests.rawsql; import java.util.List; +import java.util.concurrent.ExecutionException; import org.junit.Assert; import org.junit.Test; @@ -8,8 +9,8 @@ import org.junit.Test; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.FetchConfig; -import com.avaje.ebean.Page; -import com.avaje.ebean.PagingList; +import com.avaje.ebean.FutureRowCount; +import com.avaje.ebean.PagedList; import com.avaje.ebean.Query; import com.avaje.ebean.RawSql; import com.avaje.ebean.RawSqlBuilder; @@ -19,52 +20,86 @@ import com.avaje.tests.model.basic.ResetBasicData; public class TestRawSqlOrmQuery extends BaseTestCase { @Test - public void test() { + public void test() { - ResetBasicData.reset(); - - RawSql rawSql = - RawSqlBuilder - .parse("select r.id, r.name from o_customer r ") - .columnMapping("r.id", "id") - .columnMapping("r.name", "name") - .create(); - - Query query = Ebean.find(Customer.class); - query.setRawSql(rawSql); - query.where().ilike("name", "r%"); - - query.fetch("contacts", new FetchConfig().query()); - query.filterMany("contacts").gt("lastName", "b"); - - List list = query.findList(); - Assert.assertNotNull(list); - } + ResetBasicData.reset(); + + RawSql rawSql = RawSqlBuilder.parse("select r.id, r.name from o_customer r ") + .columnMapping("r.id", "id") + .columnMapping("r.name", "name").create(); + + Query query = Ebean.find(Customer.class); + query.setRawSql(rawSql); + query.where().ilike("name", "r%"); + + query.fetch("contacts", new FetchConfig().query()); + query.filterMany("contacts").gt("lastName", "b"); + + List list = query.findList(); + Assert.assertNotNull(list); + } @Test - public void testPaging() { - - ResetBasicData.reset(); - - RawSql rawSql = - RawSqlBuilder - .parse("select r.id, r.name from o_customer r ") - .columnMapping("r.id", "id") - .columnMapping("r.name", "name") - .create(); - - Query query = Ebean.find(Customer.class); - query.setRawSql(rawSql); - PagingList pagingList = query.findPagingList(10); - Page page = pagingList.getPage(0); - List list = page.getList(); - - System.out.println(page); - System.out.println(list); - - for (Customer customer : list) { - customer.getCretime(); - } - + public void testFirstRowsMaxRows() throws InterruptedException, ExecutionException { + + ResetBasicData.reset(); + + RawSql rawSql = + RawSqlBuilder + .parse("select r.id, r.name from o_customer r ") + .columnMapping("r.id", "id") + .columnMapping("r.name", "name") + .create(); + + Query query = Ebean.find(Customer.class); + query.setRawSql(rawSql); + + int initialRowCount = query.findRowCount(); + + query.setFirstRow(1); + query.setMaxRows(2); + List list = query.findList(); + + int rowCount = query.findRowCount(); + FutureRowCount futureRowCount = query.findFutureRowCount(); + + Assert.assertEquals(initialRowCount, rowCount); + Assert.assertEquals(initialRowCount, futureRowCount.get().intValue()); + + // check that lazy loading still executes + for (Customer customer : list) { + customer.getCretime(); } + + } + + @Test + public void testPaging() { + + ResetBasicData.reset(); + + RawSql rawSql = RawSqlBuilder.parse("select r.id, r.name from o_customer r ") + .columnMapping("r.id", "id") + .columnMapping("r.name", "name") + .create(); + + Query query = Ebean.find(Customer.class); + query.setRawSql(rawSql); + + int initialRowCount = query.findRowCount(); + + PagedList page = query.findPagedList(0, 2); + + List list = page.getList(); + int rowCount = page.getTotalRowCount(); + + Assert.assertEquals(2, list.size()); + Assert.assertEquals(initialRowCount, rowCount); + + // check that lazy loading executes + for (Customer customer : list) { + customer.getCretime(); + } + + } }