diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java index 03a1601d3..eec6b8e61 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java @@ -533,7 +533,7 @@ public class BeanProperty implements ElPropertyValue { sqlBeanLoad.load(this); } - public void buildSelectExpressionChain(String prefix, List selectChain) { + public void buildRawSqlSelectChain(String prefix, List selectChain) { if (prefix == null) { selectChain.add(name); } else { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index be19b6cb5..b23cd4779 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -225,7 +225,8 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { return createElPropertyValue(propName, remainder, chain, propertyDeploy); } - public void buildSelectExpressionChain(String prefix, List selectChain) { + @Override + public void buildRawSqlSelectChain(String prefix, List selectChain) { // do not add to the selectChain at the top level of the Many bean } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index 9adbeecb8..7885014b6 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -1,13 +1,5 @@ package com.avaje.ebeaninternal.server.deploy; -import java.io.IOException; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import javax.persistence.PersistenceException; - import com.avaje.ebean.EbeanServer; import com.avaje.ebean.Query; import com.avaje.ebean.SqlUpdate; @@ -28,6 +20,13 @@ import com.avaje.ebeaninternal.server.query.SqlJoinType; import com.avaje.ebeaninternal.server.text.json.ReadJson; import com.avaje.ebeaninternal.server.text.json.WriteJson; +import javax.persistence.PersistenceException; +import java.io.IOException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + /** * Property mapped to a joined bean. */ @@ -273,17 +272,27 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { return embeddedProps; } - public void buildSelectExpressionChain(String prefix, List selectChain) { + @Override + public void buildRawSqlSelectChain(String prefix, List selectChain) { prefix = SplitName.add(prefix, name); if (!embedded){ - targetIdBinder.buildSelectExpressionChain(prefix, selectChain); - + InheritInfo inheritInfo = targetDescriptor.getInheritInfo(); + if (inheritInfo != null) { + // expect the discriminator column to be included in order + // to determine the inheritance type so we add it to the + // selectChain (so that it takes a position in the resultSet) + String discriminatorColumn = inheritInfo.getDiscriminatorColumn(); + String discProperty = prefix + "." + discriminatorColumn; + selectChain.add(discProperty); + } + targetIdBinder.buildRawSqlSelectChain(prefix, selectChain); + } else { for (int i = 0; i < embeddedProps.length; i++) { - embeddedProps[i].buildSelectExpressionChain(prefix, selectChain); - } + embeddedProps[i].buildRawSqlSelectChain(prefix, selectChain); + } } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinder.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinder.java index 41b807cf9..45c1b47fd 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinder.java @@ -1,13 +1,6 @@ package com.avaje.ebeaninternal.server.deploy.id; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.sql.SQLException; -import java.util.List; - import com.avaje.ebean.bean.EntityBean; - import com.avaje.ebeaninternal.api.SpiExpressionRequest; import com.avaje.ebeaninternal.server.core.DefaultSqlUpdate; import com.avaje.ebeaninternal.server.deploy.BeanProperty; @@ -15,6 +8,12 @@ import com.avaje.ebeaninternal.server.deploy.DbReadContext; import com.avaje.ebeaninternal.server.deploy.DbSqlContext; import com.avaje.ebeaninternal.server.type.DataBind; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + /** * Binds id values to prepared statements. */ @@ -135,7 +134,7 @@ public interface IdBinder { */ public String getIdInValueExprDelete(int size); - public void buildSelectExpressionChain(String prefix, List selectChain); + public void buildRawSqlSelectChain(String prefix, List selectChain); /** * Read the id value from the result set and set it to the bean also returning diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmbedded.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmbedded.java index 20ee2787d..95d0e0d6d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmbedded.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmbedded.java @@ -1,11 +1,5 @@ package com.avaje.ebeaninternal.server.deploy.id; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.sql.SQLException; -import java.util.List; - import com.avaje.ebean.bean.EntityBean; import com.avaje.ebeaninternal.api.SpiExpressionRequest; import com.avaje.ebeaninternal.server.core.DefaultSqlUpdate; @@ -17,6 +11,12 @@ import com.avaje.ebeaninternal.server.deploy.DbSqlContext; import com.avaje.ebeaninternal.server.query.SplitName; import com.avaje.ebeaninternal.server.type.DataBind; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + /** * Bind an Id that is an Embedded bean. */ @@ -115,12 +115,12 @@ public final class IdBinderEmbedded implements IdBinder { return embIdProperty.getName(); } - public void buildSelectExpressionChain(String prefix, List selectChain) { + public void buildRawSqlSelectChain(String prefix, List selectChain) { prefix = SplitName.add(prefix, embIdProperty.getName()); for (int i = 0; i < props.length; i++) { - props[i].buildSelectExpressionChain(prefix, selectChain); + props[i].buildRawSqlSelectChain(prefix, selectChain); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmpty.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmpty.java index fe1efe507..dde98d1a7 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmpty.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderEmpty.java @@ -1,13 +1,6 @@ package com.avaje.ebeaninternal.server.deploy.id; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.sql.SQLException; -import java.util.List; - import com.avaje.ebean.bean.EntityBean; - import com.avaje.ebeaninternal.api.SpiExpressionRequest; import com.avaje.ebeaninternal.server.core.DefaultSqlUpdate; import com.avaje.ebeaninternal.server.deploy.BeanProperty; @@ -15,6 +8,12 @@ import com.avaje.ebeaninternal.server.deploy.DbReadContext; import com.avaje.ebeaninternal.server.deploy.DbSqlContext; import com.avaje.ebeaninternal.server.type.DataBind; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + /** * For beans with no id properties AKA report type beans. */ @@ -38,7 +37,7 @@ public final class IdBinderEmpty implements IdBinder { return pathPrefix; } - public void buildSelectExpressionChain(String prefix, List selectChain) { + public void buildRawSqlSelectChain(String prefix, List selectChain) { } public int getPropertyCount() { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderSimple.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderSimple.java index 1dd79dd01..a0e33a8d7 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderSimple.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/id/IdBinderSimple.java @@ -1,13 +1,6 @@ package com.avaje.ebeaninternal.server.deploy.id; -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.sql.SQLException; -import java.util.List; - import com.avaje.ebean.bean.EntityBean; - import com.avaje.ebeaninternal.api.SpiExpressionRequest; import com.avaje.ebeaninternal.server.core.DefaultSqlUpdate; import com.avaje.ebeaninternal.server.core.InternString; @@ -17,6 +10,12 @@ import com.avaje.ebeaninternal.server.deploy.DbSqlContext; import com.avaje.ebeaninternal.server.type.DataBind; import com.avaje.ebeaninternal.server.type.ScalarType; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + /** * Bind an Id where the Id is made of a single property (not embedded). */ @@ -59,9 +58,9 @@ public final class IdBinderSimple implements IdBinder { return sb.toString(); } - public void buildSelectExpressionChain(String prefix, List selectChain) { + public void buildRawSqlSelectChain(String prefix, List selectChain) { - idProperty.buildSelectExpressionChain(prefix, selectChain); + idProperty.buildRawSqlSelectChain(prefix, selectChain); } /** diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPlanRawSql.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPlanRawSql.java index 21083b027..499894264 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPlanRawSql.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPlanRawSql.java @@ -31,9 +31,11 @@ public class CQueryPlanRawSql extends CQueryPlan { private int[] createIndexPositions(OrmQueryRequest request, SqlTree sqlTree) { - List chain = sqlTree.buildSelectExpressionChain(); + List chain = sqlTree.buildRawSqlSelectChain(); ColumnMapping columnMapping = request.getQuery().getRawSql().getColumnMapping(); + // if the top level bean has inheritance expect first column + // to be the discriminator type column (and use offset 1) InheritInfo inheritInfo = request.getBeanDescriptor().getInheritInfo(); boolean addDiscriminator = inheritInfo != null; int offset = addDiscriminator ? 1 : 0; @@ -43,12 +45,25 @@ public class CQueryPlanRawSql extends CQueryPlan { // discriminator column must always be first in the query indexPositions[0] = 1; } + + // set the resultSet index positions for the property expressions for (int i = 0; i < chain.size(); i++) { String expr = chain.get(i); int indexPos = 1 + columnMapping.getIndexPosition(expr); indexPositions[i + offset] = indexPos; } + // check and handle the case where a discriminator column for + // an associated bean is in the raw SQL but is mapped columnIgnore + for (int i = 0; i buildSelectExpressionChain() { + public List buildRawSqlSelectChain() { ArrayList list = new ArrayList(); - rootNode.buildSelectExpressionChain(list); + rootNode.buildRawSqlSelectChain(list); return list; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNode.java b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNode.java index ae6f15b6f..0a4864eff 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNode.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNode.java @@ -1,17 +1,20 @@ package com.avaje.ebeaninternal.server.query; -import java.sql.SQLException; -import java.util.List; - import com.avaje.ebean.bean.EntityBean; import com.avaje.ebeaninternal.server.deploy.DbReadContext; import com.avaje.ebeaninternal.server.deploy.DbSqlContext; +import java.sql.SQLException; +import java.util.List; + public interface SqlTreeNode { String COMMA = ", "; - void buildSelectExpressionChain(List selectChain); + /** + * Build the select chain for a RawSql query. + */ + void buildRawSqlSelectChain(List selectChain); /** * Append the required column information to the SELECT part of the sql diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java index f34e47ba3..3ad44adf3 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -137,18 +137,18 @@ public class SqlTreeNodeBean implements SqlTreeNode { } } - public void buildSelectExpressionChain(List selectChain) { + public void buildRawSqlSelectChain(List selectChain) { if (readId) { - idBinder.buildSelectExpressionChain(prefix, selectChain); + idBinder.buildRawSqlSelectChain(prefix, selectChain); } for (int i = 0, x = properties.length; i < x; i++) { - properties[i].buildSelectExpressionChain(prefix, selectChain); + properties[i].buildRawSqlSelectChain(prefix, selectChain); } // recursively continue reading... for (int i = 0; i < children.length; i++) { // read each child... and let them set their // values back to this localBean - children[i].buildSelectExpressionChain(selectChain); + children[i].buildRawSqlSelectChain(selectChain); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java index b6e248f7b..247d843bf 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeExtraJoin.java @@ -1,9 +1,5 @@ package com.avaje.ebeaninternal.server.query; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - import com.avaje.ebean.bean.EntityBean; import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssoc; import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany; @@ -11,6 +7,10 @@ import com.avaje.ebeaninternal.server.deploy.DbReadContext; import com.avaje.ebeaninternal.server.deploy.DbSqlContext; import com.avaje.ebeaninternal.server.deploy.TableJoin; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + /** * The purpose is to add an extra join to the query. *

@@ -35,7 +35,8 @@ public class SqlTreeNodeExtraJoin implements SqlTreeNode { this.manyJoin = assocBeanProperty instanceof BeanPropertyAssocMany; } - public void buildSelectExpressionChain(List selectChain) { + @Override + public void buildRawSqlSelectChain(List selectChain) { // nothing to add } @@ -49,7 +50,6 @@ public class SqlTreeNodeExtraJoin implements SqlTreeNode { return manyJoin; } - public String getName() { return prefix; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java index 21970c80c..ad60eec51 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyWhereJoin.java @@ -1,9 +1,5 @@ package com.avaje.ebeaninternal.server.query; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - import com.avaje.ebean.bean.EntityBean; import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssoc; import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany; @@ -12,6 +8,9 @@ import com.avaje.ebeaninternal.server.deploy.DbReadContext; import com.avaje.ebeaninternal.server.deploy.DbSqlContext; import com.avaje.ebeaninternal.server.deploy.TableJoin; +import java.sql.SQLException; +import java.util.List; + /** * Join to Many (or child of a many) to support where clause predicates on many properties. */ @@ -76,7 +75,7 @@ public class SqlTreeNodeManyWhereJoin implements SqlTreeNode { } } - public void buildSelectExpressionChain(List selectChain) { + public void buildRawSqlSelectChain(List selectChain) { // nothing to add } diff --git a/src/test/java/com/avaje/ebean/BaseTestCase.java b/src/test/java/com/avaje/ebean/BaseTestCase.java index c0343e194..face2ef2d 100644 --- a/src/test/java/com/avaje/ebean/BaseTestCase.java +++ b/src/test/java/com/avaje/ebean/BaseTestCase.java @@ -10,7 +10,7 @@ public class BaseTestCase { static { logger.debug("... preStart"); - if (!AgentLoader.loadAgentFromClasspath("avaje-ebeanorm-agent","debug=1;packages=com.avaje.tests.**")) { + if (!AgentLoader.loadAgentFromClasspath("avaje-ebeanorm-agent","debug=1;packages=com.avaje.tests.**,org.avaje.test.**")) { logger.info("avaje-ebeanorm-agent not found in classpath - not dynamically loaded"); } } diff --git a/src/test/java/com/avaje/tests/rawsql/inherit/ParentQueryTest.java b/src/test/java/com/avaje/tests/rawsql/inherit/ParentQueryTest.java new file mode 100644 index 000000000..538fbf682 --- /dev/null +++ b/src/test/java/com/avaje/tests/rawsql/inherit/ParentQueryTest.java @@ -0,0 +1,44 @@ +package com.avaje.tests.rawsql.inherit; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import org.avaje.test.model.rawsql.inherit.ChildA; +import org.avaje.test.model.rawsql.inherit.ChildB; +import org.avaje.test.model.rawsql.inherit.Data; +import org.avaje.test.model.rawsql.inherit.Parent; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class ParentQueryTest extends BaseTestCase { + + @Test + public void QueryParentCollectionFetch() { + + List exampleData = new ArrayList(); + exampleData.add(new Data(0)); + exampleData.add(new Data(1)); + exampleData.add(new Data(2)); + + ChildA a = new ChildA(0); + a.setData(exampleData); + Ebean.save(a); + + ChildB b = new ChildB(1); + b.setData(exampleData); + Ebean.save(b); + + ChildA c = new ChildA(2); + c.setData(exampleData); + Ebean.save(c); + + List partial = Ebean.find(Parent.class).where().ge("number", 1).findList(); + assertNotNull(partial.get(0).getData()); + assertEquals(partial.get(0).getData().get(0).getNumber().intValue(), 0); + } + +} diff --git a/src/test/java/com/avaje/tests/rawsql/inherit/ParentRawSqlTest.java b/src/test/java/com/avaje/tests/rawsql/inherit/ParentRawSqlTest.java new file mode 100644 index 000000000..ffad8aee1 --- /dev/null +++ b/src/test/java/com/avaje/tests/rawsql/inherit/ParentRawSqlTest.java @@ -0,0 +1,155 @@ +package com.avaje.tests.rawsql.inherit; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import com.avaje.ebean.FetchConfig; +import com.avaje.ebean.RawSql; +import com.avaje.ebean.RawSqlBuilder; +import org.avaje.test.model.rawsql.inherit.ChildA; +import org.avaje.test.model.rawsql.inherit.ChildB; +import org.avaje.test.model.rawsql.inherit.Data; +import org.avaje.test.model.rawsql.inherit.Parent; +import org.avaje.test.model.rawsql.inherit.ParentAggregate; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class ParentRawSqlTest extends BaseTestCase { + + @Test + public void RawSqlParentLoad() { + + List exampleData = new ArrayList(); + exampleData.add(new Data(0)); + exampleData.add(new Data(1)); + exampleData.add(new Data(2)); + + ChildA a = new ChildA(0); + a.setData(exampleData); + Ebean.save(a); + + ChildB b = new ChildB(1); + b.setData(exampleData); + Ebean.save(b); + + ChildA c = new ChildA(2); + c.setData(exampleData); + Ebean.save(c); + + RawSql rawSql = RawSqlBuilder + .parse("select type, id, number from rawinherit_parent where number > 1") + .create(); + + List partial = Ebean.find(Parent.class) + .setRawSql(rawSql) + .findList(); + + assertNotNull(partial.get(0).getData()); + assertEquals(partial.get(0).getData().get(0).getNumber().intValue(), 0); + } + + @Test + public void RawSqlParentFetch() { + + List exampleData = new ArrayList(); + exampleData.add(new Data(0)); + exampleData.add(new Data(1)); + exampleData.add(new Data(2)); + + ChildA a = new ChildA(0); + a.setData(exampleData); + Ebean.save(a); + + ChildB b = new ChildB(1); + b.setData(exampleData); + Ebean.save(b); + + ChildA c = new ChildA(2); + c.setData(exampleData); + Ebean.save(c); + + useColumnMappingIgnore(); + + useColumnMappingWithDiscriminator(); + + useExtraColumnMappingIgnore(); + } + + /** + * Map the discriminator column - columnMapping("type", "parent.type"). + */ + private void useColumnMappingWithDiscriminator() { + + RawSql rawSql = RawSqlBuilder + .unparsed("select type, id from rawinherit_parent where number > 1") + .columnMapping("type", "parent.type") // can map the discriminator column 'type' + .columnMapping("id", "parent.id") + .create(); + + List aggregates = Ebean.find(ParentAggregate.class).setRawSql(rawSql) + .fetch("parent", new FetchConfig().query()) + .findList(); + + List partial = new ArrayList(); + for (ParentAggregate aggregate : aggregates) { + partial.add(aggregate.parent); + } + + assertNotNull(partial.get(0).getData()); + assertEquals(partial.get(0).getData().get(0).getNumber().intValue(), 0); + } + + /** + * Use columnMappingIgnore() to ignore the discriminator column. + */ + private void useColumnMappingIgnore() { + + RawSql rawSql = RawSqlBuilder + .unparsed("select type, id from rawinherit_parent where number > 1") + .columnMappingIgnore("type") // can ignore the discriminator 'type' + .columnMapping("id", "parent.id") + .create(); + + List aggregates = Ebean.find(ParentAggregate.class).setRawSql(rawSql) + .fetch("parent", new FetchConfig().query()) + .findList(); + + List partial = new ArrayList(); + for (ParentAggregate aggregate : aggregates) { + partial.add(aggregate.parent); + } + + assertNotNull(partial.get(0).getData()); + assertEquals(partial.get(0).getData().get(0).getNumber().intValue(), 0); + } + + /** + * Extra columnMappingIgnore() before and after. + */ + private void useExtraColumnMappingIgnore() { + + RawSql rawSql = RawSqlBuilder + .unparsed("select 'a', type, id, 'b' from rawinherit_parent where number > 1") + .columnMappingIgnore("a") // extra ignore before + .columnMappingIgnore("type") + .columnMapping("id", "parent.id") + .columnMappingIgnore("b") // extra ignore after + .create(); + + List aggregates = Ebean.find(ParentAggregate.class).setRawSql(rawSql) + .fetch("parent", new FetchConfig().query()) + .findList(); + + List partial = new ArrayList(); + for (ParentAggregate aggregate : aggregates) { + partial.add(aggregate.parent); + } + assertNotNull(partial.get(0).getData()); + assertEquals(partial.get(0).getData().get(0).getNumber().intValue(), 0); + } + +} diff --git a/src/test/java/org/avaje/test/model/rawsql/inherit/ChildA.java b/src/test/java/org/avaje/test/model/rawsql/inherit/ChildA.java new file mode 100644 index 000000000..b58ff73db --- /dev/null +++ b/src/test/java/org/avaje/test/model/rawsql/inherit/ChildA.java @@ -0,0 +1,18 @@ +package org.avaje.test.model.rawsql.inherit; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("A") +public class ChildA extends Parent { + + public String getName() { + return "A Name"; + } + + public ChildA(Integer number) { + super(number); + } + +} diff --git a/src/test/java/org/avaje/test/model/rawsql/inherit/ChildB.java b/src/test/java/org/avaje/test/model/rawsql/inherit/ChildB.java new file mode 100644 index 000000000..24c4fd7a4 --- /dev/null +++ b/src/test/java/org/avaje/test/model/rawsql/inherit/ChildB.java @@ -0,0 +1,17 @@ +package org.avaje.test.model.rawsql.inherit; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("B") +public class ChildB extends Parent { + + public String getName() { + return "B Name"; + } + + public ChildB(Integer number) { + super(number); + } +} diff --git a/src/test/java/org/avaje/test/model/rawsql/inherit/Data.java b/src/test/java/org/avaje/test/model/rawsql/inherit/Data.java new file mode 100644 index 000000000..b08ab7890 --- /dev/null +++ b/src/test/java/org/avaje/test/model/rawsql/inherit/Data.java @@ -0,0 +1,34 @@ +package org.avaje.test.model.rawsql.inherit; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "rawinherit_data") +public class Data { + + @Id + private Long id; + + private Integer number; + + @ManyToMany(mappedBy = "data") + public List parents = new ArrayList(); + + public Data(int number) { + this.number = number; + } + + public Long getId() { + return id; + } + + public Integer getNumber() { + return number; + } + +} diff --git a/src/test/java/org/avaje/test/model/rawsql/inherit/Parent.java b/src/test/java/org/avaje/test/model/rawsql/inherit/Parent.java new file mode 100644 index 000000000..25ba0c9df --- /dev/null +++ b/src/test/java/org/avaje/test/model/rawsql/inherit/Parent.java @@ -0,0 +1,50 @@ +package org.avaje.test.model.rawsql.inherit; + +import javax.persistence.CascadeType; +import javax.persistence.DiscriminatorColumn; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "rawinherit_parent") +@Inheritance(strategy= InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name="type") +public abstract class Parent { + + @Id + private Long id; + + private Integer number; + + @ManyToMany(cascade = CascadeType.PERSIST) + private List data = new ArrayList(); + + protected Parent(Integer number) { + this.number = number; + } + + public abstract String getName(); + + public Long getId() { + return id; + } + + public Integer getNumber() { + return number; + } + + public List getData() { + return data; + } + + public void setData(List datas) { + this.data = datas; + } + +} diff --git a/src/test/java/org/avaje/test/model/rawsql/inherit/ParentAggregate.java b/src/test/java/org/avaje/test/model/rawsql/inherit/ParentAggregate.java new file mode 100644 index 000000000..bfaeb097c --- /dev/null +++ b/src/test/java/org/avaje/test/model/rawsql/inherit/ParentAggregate.java @@ -0,0 +1,15 @@ +package org.avaje.test.model.rawsql.inherit; + +import com.avaje.ebean.annotation.Sql; + +import javax.persistence.Entity; +import javax.persistence.OneToOne; + +@Entity +@Sql +public class ParentAggregate { + + @OneToOne + public Parent parent; + +}