diff --git a/pom.xml b/pom.xml index db0853f9e..9225b0eb1 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,20 @@ provided + + + + + + + + + + + + + + com.squareup.okhttp okhttp diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index 09fdc5be0..13afc23be 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -1362,8 +1362,15 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { @Override public PagedList findPagedList(Query query, Transaction transaction, int pageIndex, int pageSize) { - - return new LimitOffsetPagedList(this, (SpiQuery)query, pageIndex, pageSize); + + SpiQuery spiQuery = (SpiQuery)query; + OrderBy orderBy = spiQuery.getOrderBy(); + if (orderBy == null || orderBy.isEmpty()) { + // add a default order by for paging queries + BeanDescriptor desc = beanDescriptorManager.getBeanDescriptor(spiQuery.getBeanType()); + query.orderBy(desc.getDefaultOrderBy()); + } + return new LimitOffsetPagedList(this, spiQuery, pageIndex, pageSize); } public void findEach(Query query, QueryEachConsumer consumer, Transaction t) { diff --git a/src/test/java/com/avaje/tests/query/TestAddOrderByWithFirstRowsMaxRows.java b/src/test/java/com/avaje/tests/query/TestAddOrderByWithFirstRowsMaxRows.java new file mode 100644 index 000000000..dc8ea1d9c --- /dev/null +++ b/src/test/java/com/avaje/tests/query/TestAddOrderByWithFirstRowsMaxRows.java @@ -0,0 +1,110 @@ +package com.avaje.tests.query; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import com.avaje.ebean.PagedList; +import com.avaje.tests.model.basic.Order; +import com.avaje.tests.model.basic.ResetBasicData; +import org.avaje.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Ebean adds order by clause if none provided when using both first rows and max rows. + */ +public class TestAddOrderByWithFirstRowsMaxRows extends BaseTestCase { + + @Test + public void test_firstRows() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + Ebean.find(Order.class) + .setFirstRow(3) + .orderBy().asc("id") + .findList(); + + List loggedSql = LoggedSqlCollector.stop(); + + assertThat(loggedSql).hasSize(1); + assertThat(loggedSql.get(0)).contains("order by t0.id"); + } + + + @Test + public void test_maxRows() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + Ebean.find(Order.class) + .setMaxRows(10) + .findList(); + + List loggedSql = LoggedSqlCollector.stop(); + + assertThat(loggedSql).hasSize(1); + } + + + @Test + public void test_firstRowsMaxRows() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + Ebean.find(Order.class) + .setFirstRow(3) + .setMaxRows(10) + .orderBy().asc("id") + .findList(); + + List loggedSql = LoggedSqlCollector.stop(); + + assertThat(loggedSql).hasSize(1); + assertThat(loggedSql.get(0)).contains("order by t0.id"); + } + + @Test + public void test_pagingOne() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + PagedList pagedList = + Ebean.find(Order.class) + .findPagedList(0, 10); + + pagedList.getList(); + + List loggedSql = LoggedSqlCollector.stop(); + + assertThat(loggedSql).hasSize(1); + assertThat(loggedSql.get(0)).contains("order by t0.id"); + } + + @Test + public void test_pagingTwo() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + Ebean.find(Order.class) + .findPagedList(1, 10) + .getList(); + + List loggedSql = LoggedSqlCollector.stop(); + + assertThat(loggedSql).hasSize(1); + assertThat(loggedSql.get(0)).contains("order by t0.id"); + } +} diff --git a/src/test/resources/ebean.properties b/src/test/resources/ebean.properties index 12018186d..cdee4b07d 100644 --- a/src/test/resources/ebean.properties +++ b/src/test/resources/ebean.properties @@ -117,6 +117,6 @@ datasource.pg.databaseDriver=org.postgresql.Driver datasource.ms.username=test datasource.ms.password=test -datasource.ms.databaseUrl=jdbc:sqlserver://192.168.1.68:1433;databaseName=test +datasource.ms.databaseUrl=jdbc:sqlserver://192.168.1.69:1433;databaseName=test datasource.ms.databaseDriver=com.microsoft.sqlserver.jdbc.SQLServerDriver