mirror of
https://github.com/ebean-orm/ebean.git
synced 2026-10-23 23:28:55 +00:00
#1333 - ENH: Support "dynamic formula" with findSingleAttributeList() ... e.g. .select("concat(lastName,', ',firstName)")
Support property alias via "AS" ... concat(lastName,', ',firstName) as lastName
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<Contact> 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<String> 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()");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user