#1346 - Since ebean version 11.12.1 executing docStore query with findPagedList fails with error (due to order by id)

This commit is contained in:
Rob Bygrave
2018-03-12 18:28:17 +13:00
parent 85bfe3d03e
commit af2b8976fa
5 changed files with 288 additions and 279 deletions
@@ -335,6 +335,18 @@ public class BeanPropertyAssocMany<T> extends BeanPropertyAssoc<T> {
return false;
}
/**
* Add the loaded current bean to its associated parent.
*
* Helper method used by Elastic integration when loading with a persistence context.
*/
public void lazyLoadMany(EntityBean current) {
EntityBean parentBean = childMasterProperty.getValueAsEntityBean(current);
if (parentBean != null) {
addBeanToCollectionWithCreate(parentBean, current, true);
}
}
public void addWhereParentIdIn(SpiQuery<?> query, List<Object> parentIds, boolean useDocStore) {
if (useDocStore) {
// assumes the ManyToOne property is included
@@ -359,7 +359,7 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
}
@Override
public Query<T> setUseDocStore(boolean useDocStore) {
public DefaultOrmQuery<T> setUseDocStore(boolean useDocStore) {
this.useDocStore = useDocStore;
return this;
}
@@ -428,7 +428,7 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
}
@Override
public Query<T> setIncludeSoftDeletes() {
public DefaultOrmQuery<T> setIncludeSoftDeletes() {
this.temporalMode = TemporalMode.SOFT_DELETED;
return this;
}
@@ -1050,14 +1050,87 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
if (isNativeSql()) {
queryPlanKey = new NativeSqlQueryPlanKey(nativeSql + "-" + firstRow + "-" + maxRows);
} else {
queryPlanKey = new OrmQueryPlanKey(beanDescriptor.getDiscValue(), m2mIncludeJoin, type, detail, maxRows, firstRow,
disableLazyLoading, manualId, orderBy,
distinct, sqlDistinct, mapKey, id, bindParams, whereExpressions, havingExpressions,
temporalMode, forUpdate, rootTableAlias, rawSql, updateProperties, countDistinctOrder);
queryPlanKey = new OrmQueryPlanKey(planDescription(), maxRows, firstRow, rawSql);
}
return queryPlanKey;
}
private String planDescription() {
StringBuilder sb = new StringBuilder(300);
if (type != null) {
sb.append("t:").append(type.ordinal());
}
if (useDocStore) {
sb.append(",ds:");
}
if (beanDescriptor.getDiscValue() != null) {
sb.append(",disc:").append(beanDescriptor.getDiscValue());
}
if (temporalMode != SpiQuery.TemporalMode.CURRENT) {
sb.append(",temp:").append(temporalMode.ordinal());
}
if (forUpdate != null) {
sb.append(",forUpd:").append(forUpdate.ordinal());
}
if (id != null) {
sb.append(",id:");
}
if (manualId) {
sb.append(",manId:");
}
if (distinct) {
sb.append(",dist:");
}
if (sqlDistinct) {
sb.append(",sqlD:");
}
if (disableLazyLoading) {
sb.append(",disLazy:");
}
if (rootTableAlias != null) {
sb.append(",root:").append(rootTableAlias);
}
if (orderBy != null) {
sb.append(",orderBy:").append(orderBy.toStringFormat());
}
if (m2mIncludeJoin != null) {
sb.append(",m2m:").append(m2mIncludeJoin.getTable());
}
if (mapKey != null) {
sb.append(",mapKey:").append(mapKey);
}
if (countDistinctOrder != null) {
sb.append(",countDistOrd:").append(countDistinctOrder.name());
}
if (detail != null) {
sb.append(" detail[");
detail.queryPlanHash(sb);
sb.append("]");
}
if (bindParams != null) {
sb.append(" bindParams[");
bindParams.buildQueryPlanHash(sb);
sb.append("]");
}
if (whereExpressions != null) {
sb.append(" where[");
whereExpressions.queryPlanHash(sb);
sb.append("]");
}
if (havingExpressions != null) {
sb.append(" having[");
havingExpressions.queryPlanHash(sb);
sb.append("]");
}
if (updateProperties != null) {
sb.append(" update[");
updateProperties.buildQueryPlanHash(sb);
sb.append("]");
}
return sb.toString();
}
@Override
public boolean isNativeSql() {
return nativeSql != null;
@@ -1449,7 +1522,7 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
@Override
public boolean checkPagingOrderBy() {
return (maxRows > 1 || firstRow > 0) && !distinct && (orderByIsEmpty() || isOrderById());
return !useDocStore && (maxRows > 1 || firstRow > 0) && !distinct && (orderByIsEmpty() || isOrderById());
}
@Override
@@ -1585,7 +1658,7 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
}
@Override
public Query<T> setDisableLazyLoading(boolean disableLazyLoading) {
public DefaultOrmQuery<T> setDisableLazyLoading(boolean disableLazyLoading) {
this.disableLazyLoading = disableLazyLoading;
return this;
}
@@ -1793,7 +1866,7 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
}
@Override
public Query<T> alias(String alias) {
public DefaultOrmQuery<T> alias(String alias) {
this.rootTableAlias = alias;
return this;
}
@@ -1,13 +1,6 @@
package io.ebeaninternal.server.querydefn;
import io.ebean.CountDistinctOrder;
import io.ebean.OrderBy;
import io.ebean.Query;
import io.ebeaninternal.api.BindParams;
import io.ebeaninternal.api.CQueryPlanKey;
import io.ebeaninternal.api.SpiExpression;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.deploy.TableJoin;
import io.ebeaninternal.server.rawsql.SpiRawSql;
/**
@@ -21,85 +14,11 @@ class OrmQueryPlanKey implements CQueryPlanKey {
private final int planHash;
private final String description;
OrmQueryPlanKey(String discValue, TableJoin m2mIncludeTable, SpiQuery.Type type, OrmQueryDetail detail, int maxRows, int firstRow, boolean disableLazyLoading,
boolean manualId, OrderBy<?> orderBy, boolean distinct, boolean sqlDistinct, String mapKey, Object id, BindParams bindParams,
SpiExpression whereExpressions, SpiExpression havingExpressions, SpiQuery.TemporalMode temporalMode,
Query.ForUpdate forUpdate, String rootTableAlias, SpiRawSql rawSql, OrmUpdateProperties updateProperties, CountDistinctOrder countDistinctOrder) {
StringBuilder sb = new StringBuilder(300);
if (type != null) {
sb.append("t:").append(type.ordinal());
}
if (discValue != null) {
sb.append("disc:").append(discValue);
}
if (temporalMode != SpiQuery.TemporalMode.CURRENT) {
sb.append(",temp:").append(temporalMode.ordinal());
}
if (forUpdate != null) {
sb.append(",forUpd:").append(forUpdate.ordinal());
}
if (id != null) {
sb.append(",id:");
}
if (manualId) {
sb.append(",manId:");
}
if (distinct) {
sb.append(",dist:");
}
if (sqlDistinct) {
sb.append(",sqlD:");
}
if (disableLazyLoading) {
sb.append(",disLazy:");
}
if (rootTableAlias != null) {
sb.append(",root:").append(rootTableAlias);
}
if (orderBy != null) {
sb.append(",orderBy:").append(orderBy.toStringFormat());
}
if (m2mIncludeTable != null) {
sb.append(",m2m:").append(m2mIncludeTable.getTable());
}
if (mapKey != null) {
sb.append(",mapKey:").append(mapKey);
}
if (countDistinctOrder != null) {
sb.append(",countdistinctoder:").append(countDistinctOrder.name());
}
OrmQueryPlanKey(String description, int maxRows, int firstRow, SpiRawSql rawSql) {
this.description = description;
this.maxRows = maxRows;
this.firstRow = firstRow;
this.rawSqlKey = (rawSql == null) ? null : rawSql.getKey();
if (detail != null) {
sb.append(" detail[");
detail.queryPlanHash(sb);
sb.append("]");
}
if (bindParams != null) {
sb.append(" bindParams[");
bindParams.buildQueryPlanHash(sb);
sb.append("]");
}
if (whereExpressions != null) {
sb.append(" where[");
whereExpressions.queryPlanHash(sb);
sb.append("]");
}
if (havingExpressions != null) {
sb.append(" having[");
havingExpressions.queryPlanHash(sb);
sb.append("]");
}
if (updateProperties != null) {
sb.append(" update[");
updateProperties.buildQueryPlanHash(sb);
sb.append("]");
}
this.description = sb.toString();
int hc = description.hashCode();
hc = hc * 92821 + (maxRows);
hc = hc * 92821 + (firstRow);