diff --git a/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java b/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java index 5b7e335f0..0eca9a112 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java +++ b/src/main/java/io/ebeaninternal/server/deploy/DbSqlContext.java @@ -67,7 +67,7 @@ public interface DbSqlContext { /** * Parse and add formula with standard table alias replacement. */ - void appendParseSelect(String parseSelect); + void appendParseSelect(String parseSelect, String alias); /** * Append a Sql Formula select. This converts the "${ta}" keyword to the diff --git a/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java b/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java index 28f494bd4..d238e7ca2 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java +++ b/src/main/java/io/ebeaninternal/server/deploy/DynamicPropertyAggregationFormula.java @@ -16,11 +16,14 @@ class DynamicPropertyAggregationFormula extends DynamicPropertyBase { private final BeanProperty asTarget; - DynamicPropertyAggregationFormula(String name, ScalarType scalarType, String parsedFormula, boolean aggregate, BeanProperty asTarget) { + private final String alias; + + DynamicPropertyAggregationFormula(String name, ScalarType scalarType, String parsedFormula, boolean aggregate, BeanProperty asTarget, String alias) { super(name, name, null, scalarType); this.parsedFormula = parsedFormula; this.aggregate = aggregate; this.asTarget = asTarget; + this.alias = alias; } @Override @@ -49,7 +52,7 @@ class DynamicPropertyAggregationFormula extends DynamicPropertyBase { @Override public void appendSelect(DbSqlContext ctx, boolean subQuery) { - ctx.appendParseSelect(parsedFormula); + ctx.appendParseSelect(parsedFormula, alias); } } diff --git a/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java b/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java index 38b348162..817868cd5 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java +++ b/src/main/java/io/ebeaninternal/server/deploy/FormulaPropertyPath.java @@ -125,7 +125,7 @@ class FormulaPropertyPath { } String parsedAggregation = buildFormula(parsed); - return new DynamicPropertyAggregationFormula(logicalName, scalarType, parsedAggregation, isAggregate(), targetProperty); + return new DynamicPropertyAggregationFormula(logicalName, scalarType, parsedAggregation, isAggregate(), targetProperty, alias); } private boolean isAggregate() { diff --git a/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java b/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java index dfb611e14..f40b9c2cf 100644 --- a/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java +++ b/src/main/java/io/ebeaninternal/server/query/DefaultDbSqlContext.java @@ -274,11 +274,15 @@ class DefaultDbSqlContext implements DbSqlContext { } @Override - public void appendParseSelect(String parseSelect) { - String converted = alias.parse(parseSelect); + public void appendParseSelect(String parseSelect, String columnAlias) { + String converted = this.alias.parse(parseSelect); sb.append(COMMA); sb.append(converted); - appendColumnAlias(); + if (columnAlias != null) { + sb.append(" ").append(columnAlias); + } else { + appendColumnAlias(); + } } @Override diff --git a/src/test/java/org/tests/query/aggregation/TestAggregationCount.java b/src/test/java/org/tests/query/aggregation/TestAggregationCount.java index 63732da01..330e769f9 100644 --- a/src/test/java/org/tests/query/aggregation/TestAggregationCount.java +++ b/src/test/java/org/tests/query/aggregation/TestAggregationCount.java @@ -444,4 +444,31 @@ public class TestAggregationCount extends BaseTestCase { assertThat(sql.get(0)).contains("select max(t0.updtime) from contact t0 where t0.phone is null"); } + + @Test + public void formula_mapToProperty() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + List contacts = + + Ebean.find(Contact.class) + .select("email, concat(lastName,', ',firstName) as lastName") + .where().isNull("phone") + .orderBy().asc("lastName") + .findList(); + + assertThat(contacts).isNotEmpty(); + + for (Contact name : contacts) { + String lastName = name.getLastName(); + assertThat(lastName).contains(", "); + } + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("select t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) lastName from contact t0 where t0.phone is null order by t0.last_name; --bind()"); + } + }