#1612 - query.setMapKey("customer.id") throws NullPointerException (ie. mapKey is a path rather than local property)

This commit is contained in:
rob bygrave
2019-01-21 21:57:30 +13:00
parent ab48f796c6
commit 4a0806e453
5 changed files with 63 additions and 19 deletions
@@ -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 <T> BeanCollectionHelp<T> create(SpiQuery.Type manyType, OrmQueryRequest<T> request) {
public static <T> CQueryCollectionAdd<T> create(SpiQuery.Type manyType, OrmQueryRequest<T> 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<T> 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;
}
}
@@ -24,16 +24,6 @@ public class BeanMapHelp<T> extends BaseCollectionHelp<T> {
private final String propertyName;
private final BeanProperty beanProperty;
/**
* When created for a given query that will return a map.
*/
BeanMapHelp(BeanDescriptor<T> 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.
*/
@@ -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<T> implements CQueryCollectionAdd<T> {
private final ElPropertyValue elGetValue;
/**
* Create for a findMap query.
*/
BeanMapQueryHelp(ElPropertyValue elGetValue) {
this.elGetValue = elGetValue;
}
@Override
public BeanCollection<T> 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);
}
}
}
@@ -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<T> implements DbReadContext, CancelableQuery, SpiProfileTran
this.collection = (help != null ? help.createEmptyNoParent() : null);
}
private BeanCollectionHelp<T> createHelp(OrmQueryRequest<T> request) {
private CQueryCollectionAdd<T> createHelp(OrmQueryRequest<T> request) {
if (request.isFindById()) {
return null;
} else {