diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java b/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java index d57b622b1..a3376cd2e 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanCollectionHelpFactory.java @@ -2,6 +2,8 @@ package io.ebeaninternal.server.deploy; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.core.OrmQueryRequest; +import io.ebeaninternal.server.el.ElPropertyValue; +import io.ebeaninternal.server.query.CQueryCollectionAdd; /** @@ -10,10 +12,10 @@ import io.ebeaninternal.server.core.OrmQueryRequest; public class BeanCollectionHelpFactory { @SuppressWarnings("rawtypes") - static final BeanListHelp LIST_HELP = new BeanListHelp(); + private static final BeanListHelp LIST_HELP = new BeanListHelp(); @SuppressWarnings("rawtypes") - static final BeanSetHelp SET_HELP = new BeanSetHelp(); + private static final BeanSetHelp SET_HELP = new BeanSetHelp(); /** * Create the helper based on the many property. @@ -36,7 +38,7 @@ public class BeanCollectionHelpFactory { } @SuppressWarnings("unchecked") - public static BeanCollectionHelp create(SpiQuery.Type manyType, OrmQueryRequest request) { + public static CQueryCollectionAdd create(SpiQuery.Type manyType, OrmQueryRequest request) { if (manyType == SpiQuery.Type.LIST) { return LIST_HELP; @@ -44,10 +46,13 @@ public class BeanCollectionHelpFactory { } else if (manyType == SpiQuery.Type.SET) { return SET_HELP; - } else { + } else if (manyType == SpiQuery.Type.MAP) { BeanDescriptor target = request.getBeanDescriptor(); - String mapKey = request.getQuery().getMapKey(); - return new BeanMapHelp<>(target, mapKey); + ElPropertyValue elProperty = target.getElGetValue(request.getQuery().getMapKey()); + return new BeanMapQueryHelp<>(elProperty); + + } else { + return null; } } diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelp.java index 14440a26f..f28fa54b9 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelp.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanMapHelp.java @@ -24,16 +24,6 @@ public class BeanMapHelp extends BaseCollectionHelp { private final String propertyName; private final BeanProperty beanProperty; - /** - * When created for a given query that will return a map. - */ - BeanMapHelp(BeanDescriptor targetDescriptor, String mapKey) { - this.targetDescriptor = targetDescriptor; - this.beanProperty = targetDescriptor.getBeanProperty(mapKey); - this.many = null; - this.propertyName = null; - } - /** * When help is attached to a specific many property. */ diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanMapQueryHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanMapQueryHelp.java new file mode 100644 index 000000000..e78381b0b --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanMapQueryHelp.java @@ -0,0 +1,35 @@ +package io.ebeaninternal.server.deploy; + +import io.ebean.bean.BeanCollection; +import io.ebean.bean.EntityBean; +import io.ebean.common.BeanMap; +import io.ebeaninternal.server.el.ElPropertyValue; +import io.ebeaninternal.server.query.CQueryCollectionAdd; + +class BeanMapQueryHelp implements CQueryCollectionAdd { + + private final ElPropertyValue elGetValue; + + /** + * Create for a findMap query. + */ + BeanMapQueryHelp(ElPropertyValue elGetValue) { + this.elGetValue = elGetValue; + } + + @Override + public BeanCollection createEmptyNoParent() { + return new BeanMap<>(); + } + + @Override + public void add(BeanCollection collection, EntityBean bean, boolean withCheck) { + if (bean == null) { + ((BeanMap) collection).internalPutNull(); + } else { + Object keyValue = elGetValue.pathGet(bean); + BeanMap map = ((BeanMap) collection); + map.internalPutWithCheck(keyValue, bean); + } + } +} diff --git a/src/main/java/io/ebeaninternal/server/query/CQuery.java b/src/main/java/io/ebeaninternal/server/query/CQuery.java index 6f7645c40..ae0a376ff 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/io/ebeaninternal/server/query/CQuery.java @@ -18,7 +18,6 @@ import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.autotune.ProfilingListener; import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.core.SpiOrmQueryRequest; -import io.ebeaninternal.server.deploy.BeanCollectionHelp; import io.ebeaninternal.server.deploy.BeanCollectionHelpFactory; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; @@ -236,7 +235,7 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran this.collection = (help != null ? help.createEmptyNoParent() : null); } - private BeanCollectionHelp createHelp(OrmQueryRequest request) { + private CQueryCollectionAdd createHelp(OrmQueryRequest request) { if (request.isFindById()) { return null; } else { diff --git a/src/test/java/org/tests/query/TestQueryFindMapTypedKey.java b/src/test/java/org/tests/query/TestQueryFindMapTypedKey.java index 5269baf12..8ea8457a0 100644 --- a/src/test/java/org/tests/query/TestQueryFindMapTypedKey.java +++ b/src/test/java/org/tests/query/TestQueryFindMapTypedKey.java @@ -2,10 +2,11 @@ package org.tests.query; import io.ebean.BaseTestCase; import io.ebean.Ebean; +import org.junit.Test; import org.tests.model.basic.Customer; +import org.tests.model.basic.Order; import org.tests.model.basic.Product; import org.tests.model.basic.ResetBasicData; -import org.junit.Test; import java.util.Map; @@ -34,6 +35,20 @@ public class TestQueryFindMapTypedKey extends BaseTestCase { .findMap(); assertNotNull(map); + } + + @Test + public void test_manyToOneId() { + + ResetBasicData.reset(); + + Map orderMap = Ebean.find(Order.class) + .where().eq("status", Order.Status.NEW) + .setMapKey("customer.id") + .findMap(); + + assertThat(orderMap).isNotEmpty(); + assertThat(orderMap.keySet()).contains(1, 2); } }