#416 - RawSql issue with inheritance - PersistenceException: Inheritance type for discriminator value

This commit is contained in:
Robin Bygrave
2016-05-19 22:44:55 +12:00
parent db8dd48e53
commit 5122ea4b4d
8 changed files with 92 additions and 71 deletions
@@ -1,15 +1,14 @@
package com.avaje.ebeaninternal.server.query;
import java.sql.ResultSet;
import java.util.List;
import com.avaje.ebean.RawSql.ColumnMapping;
import com.avaje.ebean.config.dbplatform.SqlLimitResponse;
import com.avaje.ebeaninternal.server.core.OrmQueryRequest;
import com.avaje.ebeaninternal.server.deploy.InheritInfo;
import com.avaje.ebeaninternal.server.type.DataReader;
import com.avaje.ebeaninternal.server.type.RsetDataReaderIndexed;
import java.sql.ResultSet;
import java.util.List;
/**
* RawSql based query plan.
*/
@@ -18,9 +17,7 @@ public class CQueryPlanRawSql extends CQueryPlan {
private final int[] rsetIndexPositions;
public CQueryPlanRawSql(OrmQueryRequest<?> request, SqlLimitResponse sqlRes, SqlTree sqlTree, String logWhereSql) {
super(request, sqlRes, sqlTree, true, logWhereSql);
this.rsetIndexPositions = createIndexPositions(request, sqlTree);
}
@@ -34,23 +31,11 @@ public class CQueryPlanRawSql extends CQueryPlan {
List<String> 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;
int[] indexPositions = new int[chain.size() + offset];
if (addDiscriminator) {
// discriminator column must always be first in the query
indexPositions[0] = 1;
}
int[] indexPositions = new int[chain.size()];
// 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;
indexPositions[i] = 1 + columnMapping.getIndexPosition(chain.get(i));
}
// check and handle the case where a discriminator column for
@@ -160,6 +160,10 @@ public class SqlTreeNodeBean implements SqlTreeNode {
public void buildRawSqlSelectChain(List<String> selectChain) {
if (readId) {
if (desc.hasInheritance()) {
// discriminator column always proceeds id column
selectChain.add(getPath(prefix, desc.getInheritInfo().getDiscriminatorColumn()));
}
idBinder.buildRawSqlSelectChain(prefix, selectChain);
}
for (int i = 0, x = properties.length; i < x; i++) {
@@ -4,6 +4,9 @@ import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone;
import java.sql.ResultSet;
/**
* A DataReader with indexed positions for the properties to read specifically for RawSql use.
*/
public class RsetDataReaderIndexed extends RsetDataReader {
private final int[] rsetIndexPositions;