FIX: order by must be added in findEach also (#1163)

This commit is contained in:
Roland Praml
2017-10-09 20:28:36 +13:00
committed by Rob Bygrave
parent 1909ba1557
commit fb1c7667cc
2 changed files with 43 additions and 8 deletions
@@ -191,6 +191,7 @@ public class CQueryEngine {
*/
public <T> QueryIterator<T> findIterate(OrmQueryRequest<T> request) {
prepareForPaging(request);
CQuery<T> 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 <T> void prepareForPaging(OrmQueryRequest<T> request) {
SpiQuery<T> query = request.getQuery();
if (!query.isDistinct() && (query.getMaxRows() > 1 || query.getFirstRow() > 0)) {
request.getBeanDescriptor().appendOrderById(query);
}
}
/**
* Find a list/map/set of beans.
*/
<T> BeanCollection<T> findMany(OrmQueryRequest<T> request) {
SpiQuery<T> 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<T> 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!");
@@ -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<Order> orders = Ebean.find(Order.class)
.select("status")
.setMaxRows(10)
.setUseCache(false)
.findIterate();
while (orders.hasNext()) {
orders.next(); // dummy read
}
List<String> 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() {