#1571 - NPE in cacheable bean with embeddedid on delete

This commit is contained in:
rob bygrave
2018-12-05 23:03:15 +13:00
parent 0405ceb96c
commit e4088c5fbe
16 changed files with 142 additions and 62 deletions
@@ -1,14 +1,14 @@
package io.ebeaninternal.server.query;
import io.ebean.util.JdbcClose;
import io.ebean.CountedValue;
import io.ebean.util.JdbcClose;
import io.ebeaninternal.api.SpiProfileTransactionEvent;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.api.SpiTransaction;
import io.ebeaninternal.server.core.OrmQueryRequest;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.type.RsetDataReader;
import io.ebeaninternal.server.type.ScalarType;
import io.ebeaninternal.server.type.ScalarDataReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -60,7 +60,7 @@ class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent {
private int rowCount;
private final ScalarType<?> scalarType;
private final ScalarDataReader<?> reader;
private final boolean containsCounts;
@@ -77,7 +77,7 @@ class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent {
this.desc = request.getBeanDescriptor();
this.predicates = predicates;
this.containsCounts = containsCounts;
this.scalarType = queryPlan.getSingleAttributeScalarType();
this.reader = queryPlan.getSingleAttributeScalarType();
query.setGeneratedSql(sql);
}
@@ -106,7 +106,7 @@ class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent {
List<Object> result = new ArrayList<>();
while (dataReader.next()) {
Object value = scalarType.read(dataReader);
Object value = reader.read(dataReader);
if (containsCounts) {
value = new CountedValue<>(value, dataReader.getLong());
}
@@ -15,7 +15,7 @@ import io.ebeaninternal.server.query.CQueryPlanStats.Snapshot;
import io.ebeaninternal.server.type.DataBind;
import io.ebeaninternal.server.type.DataReader;
import io.ebeaninternal.server.type.RsetDataReader;
import io.ebeaninternal.server.type.ScalarType;
import io.ebeaninternal.server.type.ScalarDataReader;
import io.ebeaninternal.server.util.Md5;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -286,8 +286,8 @@ public class CQueryPlan {
return stats.getLastQueryTime();
}
ScalarType<?> getSingleAttributeScalarType() {
return sqlTree.getRootNode().getSingleAttributeScalarType();
ScalarDataReader<?> getSingleAttributeScalarType() {
return sqlTree.getRootNode().getSingleAttributeReader();
}
/**
@@ -2,6 +2,7 @@ package io.ebeaninternal.server.query;
import io.ebeaninternal.server.deploy.DbReadContext;
import io.ebeaninternal.server.deploy.DbSqlContext;
import io.ebeaninternal.server.type.ScalarDataReader;
import io.ebeaninternal.server.type.ScalarType;
import java.util.List;
@@ -11,7 +12,7 @@ import java.util.List;
* <p>
* A BeanProperty or a dynamically created property based on formula.
*/
public interface STreeProperty {
public interface STreeProperty extends ScalarDataReader<Object> {
/**
* Return the property name.
@@ -1,7 +1,7 @@
package io.ebeaninternal.server.query;
import io.ebean.bean.EntityBean;
import io.ebeaninternal.server.type.ScalarType;
import io.ebeaninternal.server.type.ScalarDataReader;
public interface STreePropertyAssocOne extends STreePropertyAssoc {
@@ -13,7 +13,7 @@ public interface STreePropertyAssocOne extends STreePropertyAssoc {
/**
* Return the scalar type of the associated id property.
*/
ScalarType<?> getIdScalarType();
ScalarDataReader<?> getIdReader();
/**
* Returns true, if this relation has a foreign key.
@@ -5,7 +5,7 @@ import io.ebean.bean.EntityBean;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.deploy.DbReadContext;
import io.ebeaninternal.server.deploy.DbSqlContext;
import io.ebeaninternal.server.type.ScalarType;
import io.ebeaninternal.server.type.ScalarDataReader;
import java.sql.SQLException;
import java.util.List;
@@ -80,9 +80,9 @@ interface SqlTreeNode {
boolean hasMany();
/**
* Return the property for singleAttribute query.
* Return the reader for the single attribute query.
*/
ScalarType<?> getSingleAttributeScalarType();
ScalarDataReader<?> getSingleAttributeReader();
/**
* Return true if the query is known to only have a single property selected.
@@ -14,7 +14,7 @@ import io.ebeaninternal.server.deploy.DbSqlContext;
import io.ebeaninternal.server.deploy.InheritInfo;
import io.ebeaninternal.server.deploy.TableJoin;
import io.ebeaninternal.server.deploy.id.IdBinder;
import io.ebeaninternal.server.type.ScalarType;
import io.ebeaninternal.server.type.ScalarDataReader;
import java.sql.SQLException;
import java.sql.Timestamp;
@@ -145,22 +145,22 @@ class SqlTreeNodeBean implements SqlTreeNode {
}
@Override
public ScalarType<?> getSingleAttributeScalarType() {
public ScalarDataReader<?> getSingleAttributeReader() {
if (properties == null || properties.length == 0) {
// if we have no property ask first children (in a distinct select with join)
if (children.length == 0) {
// expected to be a findIds query
return desc.getIdBinder().getBeanProperty().getScalarType();
return desc.getIdBinder().getBeanProperty();
}
return children[0].getSingleAttributeScalarType();
return children[0].getSingleAttributeReader();
}
if (properties[0] instanceof STreePropertyAssocOne) {
STreePropertyAssocOne assocOne = (STreePropertyAssocOne)properties[0];
if (assocOne.isAssocId()) {
return assocOne.getIdScalarType();
return assocOne.getIdReader();
}
}
return properties[0].getScalarType();
return properties[0];
}
private Map<String, String> createPathMap(String prefix, STreeType desc) {
@@ -76,7 +76,7 @@ class SqlTreeNodeExtraJoin implements SqlTreeNode {
}
@Override
public ScalarType<?> getSingleAttributeScalarType() {
public ScalarType<?> getSingleAttributeReader() {
throw new IllegalStateException("No expected");
}
@@ -43,7 +43,7 @@ class SqlTreeNodeManyWhereJoin implements SqlTreeNode {
}
@Override
public ScalarType<?> getSingleAttributeScalarType() {
public ScalarType<?> getSingleAttributeReader() {
throw new IllegalStateException("No expected");
}