From 258e29d2f04179ed1309e43f01b3d7b854266e78 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 11 Jun 2018 13:29:13 +1200 Subject: [PATCH] #1415 - Add asDto(Class dtoClass) ... to ExpressionList to support fluid style --- src/main/java/io/ebean/ExpressionList.java | 8 ++++++++ .../server/expression/DefaultExpressionList.java | 6 ++++++ .../server/expression/JunctionExpression.java | 6 ++++++ src/test/java/io/ebean/DtoQueryFromOrmTest.java | 15 +++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/src/main/java/io/ebean/ExpressionList.java b/src/main/java/io/ebean/ExpressionList.java index 711d23906..efdec6e7b 100644 --- a/src/main/java/io/ebean/ExpressionList.java +++ b/src/main/java/io/ebean/ExpressionList.java @@ -120,6 +120,14 @@ public interface ExpressionList { */ Query asDraft(); + /** + * Convert the query to a DTO bean query. + *

+ * We effectively use the underlying ORM query to build the SQL and then execute + * and map it into DTO beans. + */ + DtoQuery asDto(Class dtoClass); + /** * Execute using "for update" clause which results in the DB locking the record. */ diff --git a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java index ef2e8c89c..69796ef43 100644 --- a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.expression; import io.ebean.CacheMode; import io.ebean.CountDistinctOrder; +import io.ebean.DtoQuery; import io.ebean.Expression; import io.ebean.ExpressionFactory; import io.ebean.ExpressionList; @@ -294,6 +295,11 @@ public class DefaultExpressionList implements SpiExpressionList { return query.asDraft(); } + @Override + public DtoQuery asDto(Class dtoClass) { + return query.asDto(dtoClass); + } + @Override public Query setIncludeSoftDeletes() { return query.setIncludeSoftDeletes(); diff --git a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java index d7d6c0c7a..b1fc7b4cc 100644 --- a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.expression; import io.ebean.CacheMode; import io.ebean.CountDistinctOrder; +import io.ebean.DtoQuery; import io.ebean.Expression; import io.ebean.ExpressionList; import io.ebean.FetchPath; @@ -331,6 +332,11 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression return exprList.asDraft(); } + @Override + public DtoQuery asDto(Class dtoClass) { + return exprList.asDto(dtoClass); + } + @Override public Query setIncludeSoftDeletes() { return exprList.setIncludeSoftDeletes(); diff --git a/src/test/java/io/ebean/DtoQueryFromOrmTest.java b/src/test/java/io/ebean/DtoQueryFromOrmTest.java index 0278a51c8..07e8b3122 100644 --- a/src/test/java/io/ebean/DtoQueryFromOrmTest.java +++ b/src/test/java/io/ebean/DtoQueryFromOrmTest.java @@ -256,6 +256,21 @@ public class DtoQueryFromOrmTest extends BaseTestCase { assertThat(sql.get(0)).contains("select t0.last_name, count(*) totalCount from contact t0 where t0.last_name is not null group by t0.last_name having count(*) > ?"); } + @Test + public void toDto_fromExpressionList() { + + ResetBasicData.reset(); + + List contactDtos + = Ebean.find(Contact.class) + .select("lastName, count(*) as totalCount") + .where().isNotNull("lastName") + .asDto(ContactTotals.class) + .findList(); + + assertThat(contactDtos).isNotEmpty(); + } + public static class ContactTotals { String lastName;