From 4d16cf9caac83ee2cffc9f9aca12f63c1640ed46 Mon Sep 17 00:00:00 2001 From: Matus Zamborsky Date: Mon, 1 Aug 2016 10:13:05 +0200 Subject: [PATCH 1/2] Add check for distinct query when adding id attribute to order clause in paging query --- .../com/avaje/ebeaninternal/server/query/CQueryEngine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java index 425e488f8..0818ca8ca 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java @@ -300,9 +300,10 @@ public class CQueryEngine { SpiQuery query = request.getQuery(); - if (query.getMaxRows() > 1 || query.getFirstRow() > 0) { + 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); } From cdad31bd8a69e1b86c10b0cae8c8e37d8988fcb9 Mon Sep 17 00:00:00 2001 From: Matus Zamborsky Date: Mon, 1 Aug 2016 12:20:50 +0200 Subject: [PATCH 2/2] Added test for distinct paging query --- .../tests/query/other/TestQueryDistinct.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/test/java/com/avaje/tests/query/other/TestQueryDistinct.java b/src/test/java/com/avaje/tests/query/other/TestQueryDistinct.java index 7a7e6040f..a442c3677 100644 --- a/src/test/java/com/avaje/tests/query/other/TestQueryDistinct.java +++ b/src/test/java/com/avaje/tests/query/other/TestQueryDistinct.java @@ -80,5 +80,32 @@ public class TestQueryDistinct extends BaseTestCase { Assert.assertNull(customer.getAnniversary()); } } + + @Test + public void testPagingQuery() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Customer.class) + .setMaxRows(10) + .setDistinct(true) + .select("name"); + + List customers = query.findList(); + + String generatedSql = query.getGeneratedSql(); + Assert.assertTrue(generatedSql.contains("select distinct t0.name c0 from o_customer t0 limit 10")); + + for (Customer customer : customers) { + + EntityBeanIntercept ebi = ((EntityBean)customer)._ebean_getIntercept(); + Assert.assertTrue(ebi.isDisableLazyLoad()); + Assert.assertNull(ebi.getPersistenceContext()); + + // lazy loading disabled + Assert.assertNull(customer.getId()); + Assert.assertNull(customer.getAnniversary()); + } + } }