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