diff --git a/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java b/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java index c2506237a..563a36cce 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java +++ b/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java @@ -74,7 +74,7 @@ class AssocOneHelpRefInherit extends AssocOneHelp { @Override void appendSelect(DbSqlContext ctx, boolean subQuery) { - if (!subQuery) { + if (!subQuery && inherit.hasChildren()) { // add discriminator column String relativePrefix = ctx.getRelativePrefix(property.getName()); String tableAlias = ctx.getTableAlias(relativePrefix); diff --git a/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java b/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java index 6d112329b..4476c2f81 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java +++ b/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java @@ -6,8 +6,8 @@ import io.ebeaninternal.server.deploy.id.IdBinder; import io.ebeaninternal.server.deploy.parse.DeployInheritInfo; import io.ebeaninternal.server.query.SqlTreeProperties; -import java.lang.reflect.Modifier; import javax.persistence.PersistenceException; +import java.lang.reflect.Modifier; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; @@ -175,6 +175,16 @@ public class InheritInfo { return children; } + /** + * Return true if this node has children. + *

+ * When an inheritance node has no children then we don't need + * the discriminator column as the type is effectively known. + */ + public boolean hasChildren() { + return !children.isEmpty(); + } + /** * Get the bean property additionally looking in the sub types. */ @@ -200,7 +210,6 @@ public class InheritInfo { for (InheritInfo childInfo : children) { selectProps.add(childInfo.descriptor.propertiesLocal()); - childInfo.addChildrenProperties(selectProps); } } @@ -209,9 +218,10 @@ public class InheritInfo { * Return the associated InheritInfo for this DB row read. */ public InheritInfo readType(DbReadContext ctx) throws SQLException { - - String discValue = ctx.getDataReader().getString(); - return readType(discValue); + if (!hasChildren()) { + return this; + } + return readType(ctx.getDataReader().getString()); } /** @@ -327,7 +337,6 @@ public class InheritInfo { * Return the derived where for the discriminator. */ public String getWhere() { - return where; } diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java b/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java index 4c645457d..a7491f726 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java @@ -199,9 +199,7 @@ public class DeployInheritInfo { public String getWhere() { List discList = new ArrayList<>(); - appendDiscriminator(discList); - return buildWhereLiteral(discList); } diff --git a/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java b/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java index cbb9bec93..eeb2a05fd 100644 --- a/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -543,10 +543,9 @@ class SqlTreeNodeBean implements SqlTreeNode { } if (readId) { - if (!subQuery && inheritInfo != null) { + if (!subQuery && inheritInfo != null && inheritInfo.hasChildren()) { ctx.appendColumn(inheritInfo.getDiscriminatorColumn()); } - appendSelectId(ctx, idBinder.getBeanProperty()); } appendSelect(ctx, subQuery, properties); diff --git a/src/test/java/org/tests/aggregateformula/IAFBaseSegment.java b/src/test/java/org/tests/aggregateformula/IAFBaseSegment.java new file mode 100644 index 000000000..798fd7fd3 --- /dev/null +++ b/src/test/java/org/tests/aggregateformula/IAFBaseSegment.java @@ -0,0 +1,18 @@ +package org.tests.aggregateformula; + +import javax.persistence.DiscriminatorColumn; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.Table; + +@Entity +@Inheritance +@Table(name = "iaf_segment") +@DiscriminatorColumn(name = "ptype") +public class IAFBaseSegment { + + @Id + private Long id; + +} diff --git a/src/test/java/org/tests/aggregateformula/IAFPartialSegment.java b/src/test/java/org/tests/aggregateformula/IAFPartialSegment.java new file mode 100644 index 000000000..c1e2d1d44 --- /dev/null +++ b/src/test/java/org/tests/aggregateformula/IAFPartialSegment.java @@ -0,0 +1,30 @@ +package org.tests.aggregateformula; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.Inheritance; +import javax.persistence.ManyToOne; + +@Entity +@Inheritance +@DiscriminatorValue("target") +public class IAFPartialSegment extends IAFBaseSegment { + + private final long segmentIdZat; + + @ManyToOne(optional = false) + private final IAFSegmentStatus status; + + public IAFPartialSegment(long segmentIdZat, IAFSegmentStatus status) { + this.segmentIdZat = segmentIdZat; + this.status = status; + } + + public long getSegmentIdZat() { + return segmentIdZat; + } + + public IAFSegmentStatus getStatus() { + return status; + } +} diff --git a/src/test/java/org/tests/aggregateformula/IAFSegmentStatus.java b/src/test/java/org/tests/aggregateformula/IAFSegmentStatus.java new file mode 100644 index 000000000..f0c4ac9b5 --- /dev/null +++ b/src/test/java/org/tests/aggregateformula/IAFSegmentStatus.java @@ -0,0 +1,35 @@ +package org.tests.aggregateformula; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "iaf_segment_status") +public class IAFSegmentStatus { + + @Id + private long id; + + private String name; + + public IAFSegmentStatus(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/test/java/org/tests/aggregateformula/TestAggregateInheritFormula.java b/src/test/java/org/tests/aggregateformula/TestAggregateInheritFormula.java new file mode 100644 index 000000000..558e6f448 --- /dev/null +++ b/src/test/java/org/tests/aggregateformula/TestAggregateInheritFormula.java @@ -0,0 +1,39 @@ +package org.tests.aggregateformula; + +import io.ebean.DB; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestAggregateInheritFormula { + + @Test + public void test() { + + IAFSegmentStatus st0 = new IAFSegmentStatus("st0"); + IAFSegmentStatus st1 = new IAFSegmentStatus("st1"); + + IAFPartialSegment p0 = new IAFPartialSegment(108, st0); + IAFPartialSegment p1 = new IAFPartialSegment(108, st1); + IAFPartialSegment p2 = new IAFPartialSegment(109, st0); + + DB.saveAll(Arrays.asList(st0, st1, p0, p1)); + + LoggedSqlCollector.start(); + + List segments = + DB.find(IAFPartialSegment.class) + .select("segmentIdZat, min(status)") + .where().eq("segmentIdZat", 108L) + .findList(); + + final List sql = LoggedSqlCollector.stop(); + + assertThat(segments).hasSize(1); + assertThat(sql.get(0)).contains("select t0.segment_id_zat, min(t0.status_id) from iaf_segment t0 where t0.ptype = 'target' and t0.segment_id_zat = ? group by t0.segment_id_zat"); + } +} diff --git a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java index ae8ca0e98..adfd3ff89 100644 --- a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java +++ b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java @@ -23,7 +23,6 @@ import static org.assertj.core.api.Assertions.assertThat; public class TestQuerySingleAttribute extends BaseTestCase { - @Test public void exampleUsage() { @@ -236,8 +235,7 @@ public class TestQuerySingleAttribute extends BaseTestCase { .select("more"); query.findSingleAttributeList(); - assertThat(sqlOf(query)).contains("select distinct t0.more from rawinherit_parent t0 where t0.type = 'A' "); - + assertThat(sqlOf(query)).contains("select distinct t0.more from rawinherit_parent t0 where t0.type = 'A'"); } @Test