From 733886c70bdce2f9e93b52502614dfb60f9e1aa6 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Mon, 15 Mar 2021 22:03:14 +1300 Subject: [PATCH] #2195 - @Aggregation on OneToMany property not mapping to column properly --- .../server/deploy/BeanProperty.java | 2 +- .../deploy/meta/DeployBeanDescriptor.java | 18 ++++++++++++++++-- .../server/deploy/meta/DeployBeanProperty.java | 3 +-- .../org/tests/model/tevent/TEventMany.java | 14 +++++++------- .../java/org/tests/model/tevent/TEventOne.java | 4 ++-- .../aggregation/TestAggregationCount.java | 14 +++++++------- 6 files changed, 34 insertions(+), 21 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java index 832cea70c..d3b1f429b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java @@ -324,9 +324,9 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { this.generatedProperty = deploy.getGeneratedProperty(); this.getter = deploy.getGetter(); this.setter = deploy.getSetter(); + this.aggregation = deploy.parseAggregation(); this.dbColumn = tableAliasIntern(descriptor, deploy.getDbColumn(), false, null); this.dbComment = deploy.getDbComment(); - this.aggregation = deploy.parseAggregation(); this.sqlFormulaJoin = InternString.intern(deploy.getSqlFormulaJoin()); this.sqlFormulaSelect = InternString.intern(deploy.getSqlFormulaSelect()); this.formula = sqlFormulaSelect != null; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java index 47b5efdc0..79ca0beb1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java @@ -16,6 +16,7 @@ import io.ebean.event.BeanPostLoad; import io.ebean.event.BeanQueryAdapter; import io.ebean.event.changelog.ChangeLogFilter; import io.ebean.text.PathProperties; +import io.ebean.util.SplitName; import io.ebeaninternal.api.ConcurrencyMode; import io.ebeaninternal.server.core.CacheOptions; import io.ebeaninternal.server.deploy.BeanDescriptor.EntityType; @@ -1149,8 +1150,21 @@ public class DeployBeanDescriptor { return null; } // use 'current' table alias - refer BeanProperty appendSelect() for aggregation - DeployBeanProperty property = propMap.get(expression); - return (property == null) ? null : "${ta}." + property.getDbColumn(); + String[] split = SplitName.split(expression); + if (split[0] == null) { + DeployBeanProperty property = propMap.get(expression); + return (property == null) ? null : "${ta}." + property.getDbColumn(); + } else { + DeployBeanProperty property = propMap.get(split[0]); + if (property instanceof DeployBeanPropertyAssoc) { + DeployBeanPropertyAssoc prop = (DeployBeanPropertyAssoc) property; + DeployBeanProperty beanProperty = prop.getTargetDeploy().getBeanProperty(split[1]); + if (beanProperty != null) { + return "u1." + beanProperty.getDbColumn(); + } + } + return null; + } } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java index 5b9e8d687..e20c898ce 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanProperty.java @@ -682,7 +682,6 @@ public class DeployBeanProperty { */ public void setAggregationPrefix(String prefix) { this.aggregationPrefix = prefix; - this.aggregation = (prefix == null) ? aggregation : aggregation.replace(aggregationPrefix, "u1"); } public String getElPrefix() { @@ -715,7 +714,7 @@ public class DeployBeanProperty { return sqlFormulaSelect; } if (aggregation != null) { - return aggregation; + return aggregationParsed == null ? dbColumn : aggregationParsed; } return dbColumn; } diff --git a/ebean-core/src/test/java/org/tests/model/tevent/TEventMany.java b/ebean-core/src/test/java/org/tests/model/tevent/TEventMany.java index e7ef1020e..a7eabce36 100644 --- a/ebean-core/src/test/java/org/tests/model/tevent/TEventMany.java +++ b/ebean-core/src/test/java/org/tests/model/tevent/TEventMany.java @@ -16,16 +16,16 @@ public class TEventMany { @ManyToOne TEventOne event; - int units; + int myUnits; double amount; @Version Long version; - public TEventMany(String description, int units, double amount) { + public TEventMany(String description, int myUnits, double amount) { this.description = description; - this.units = units; + this.myUnits = myUnits; this.amount = amount; } @@ -53,12 +53,12 @@ public class TEventMany { this.event = event; } - public int getUnits() { - return units; + public int getMyUnits() { + return myUnits; } - public void setUnits(int units) { - this.units = units; + public void setMyUnits(int myUnits) { + this.myUnits = myUnits; } public double getAmount() { diff --git a/ebean-core/src/test/java/org/tests/model/tevent/TEventOne.java b/ebean-core/src/test/java/org/tests/model/tevent/TEventOne.java index 88bc2e2fd..f69ad23fe 100644 --- a/ebean-core/src/test/java/org/tests/model/tevent/TEventOne.java +++ b/ebean-core/src/test/java/org/tests/model/tevent/TEventOne.java @@ -37,10 +37,10 @@ public class TEventOne { @Aggregation("count(logs.id)") Long count; - @Aggregation("sum(logs.units)") + @Aggregation("sum(logs.myUnits)") Double totalUnits; - @Aggregation("sum(logs.units * logs.amount)") + @Aggregation("sum(logs.myUnits * logs.amount)") Double totalAmount; @OneToMany(mappedBy = "event", cascade = CascadeType.ALL) diff --git a/ebean-core/src/test/java/org/tests/query/aggregation/TestAggregationCount.java b/ebean-core/src/test/java/org/tests/query/aggregation/TestAggregationCount.java index 15f7c4ddf..a91aef120 100644 --- a/ebean-core/src/test/java/org/tests/query/aggregation/TestAggregationCount.java +++ b/ebean-core/src/test/java/org/tests/query/aggregation/TestAggregationCount.java @@ -110,7 +110,7 @@ public class TestAggregationCount extends BaseTestCase { assertThat(list).isNotEmpty(); String sql = sqlOf(query2, 5); - assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount) from tevent_one t0"); + assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.my_units), sum(u1.my_units * u1.amount) from tevent_one t0"); assertThat(sql).contains("from tevent_one t0 join tevent_many u1 on u1.event_id = t0.id "); assertThat(sql).contains("where u1.description like "); assertThat(sql).contains(" group by t0.id, t0.name having count(u1.id) >= ? order by t0.name"); @@ -132,13 +132,13 @@ public class TestAggregationCount extends BaseTestCase { String sql = sqlOf(query, 5); if (isH2()) { - assertThat(sql).contains("select distinct t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount), sum(u1.units), t0.name from tevent_one t0 "); + assertThat(sql).contains("select distinct t0.id, t0.name, count(u1.id), sum(u1.my_units), sum(u1.my_units * u1.amount), sum(u1.my_units), t0.name from tevent_one t0 "); } else if (isPostgres()) { - assertThat(sql).contains("t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount), sum(u1.units), t0.name from tevent_one t0 "); + assertThat(sql).contains("t0.name, count(u1.id), sum(u1.my_units), sum(u1.my_units * u1.amount), sum(u1.my_units), t0.name from tevent_one t0 "); } assertThat(sql).contains("from tevent_one t0 join tevent_many u1 on u1.event_id = t0.id "); assertThat(sql).contains(" group by t0.id, t0.name "); - assertThat(sql).contains(" order by sum(u1.units), t0.name"); + assertThat(sql).contains(" order by sum(u1.my_units), t0.name"); } @Test @@ -149,7 +149,7 @@ public class TestAggregationCount extends BaseTestCase { query0.findList(); String sql = sqlOf(query0, 5); - assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units) from tevent_one t0"); + assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.my_units) from tevent_one t0"); assertThat(sql).contains("group by t0.id, t0.name"); } @@ -161,7 +161,7 @@ public class TestAggregationCount extends BaseTestCase { query0.findList(); String sql = sqlOf(query0, 5); - assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount) from tevent_one t0"); + assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.my_units), sum(u1.my_units * u1.amount) from tevent_one t0"); assertThat(sql).contains("group by t0.id, t0.name"); } @@ -174,7 +174,7 @@ public class TestAggregationCount extends BaseTestCase { query0.findList(); String sql = sqlOf(query0, 5); - assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.units), sum(u1.units * u1.amount) from tevent_one t0"); + assertThat(sql).contains("select t0.id, t0.name, count(u1.id), sum(u1.my_units), sum(u1.my_units * u1.amount) from tevent_one t0"); assertThat(sql).contains("group by t0.id, t0.name"); }