diff --git a/src/main/java/com/avaje/ebean/Query.java b/src/main/java/com/avaje/ebean/Query.java
index 4018687bc..c0fdf06a4 100644
--- a/src/main/java/com/avaje/ebean/Query.java
+++ b/src/main/java/com/avaje/ebean/Query.java
@@ -1310,7 +1310,7 @@ public interface Query {
* returned. In this sense it should be treated as a read only object graph.
*
*/
- Query setUseCache(boolean useBeanCache);
+ Query setUseCache(boolean useCache);
/**
* Set this to true to use the query cache.
diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java
index fec134ac0..36123dab2 100644
--- a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java
+++ b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java
@@ -526,9 +526,15 @@ public interface SpiQuery extends Query {
boolean hasMaxRowsOrFirstRow();
/**
- * Return true if this query should use/check the bean cache.
+ * Return true if the bean cache should be exclude for query or lazy loading.
*/
- Boolean isUseBeanCache();
+ boolean isExcludeBeanCache();
+
+ /**
+ * Return true if this query should use the bean cache.
+ * It is not skipped and bean caching is supported.
+ */
+ boolean isUseBeanCache();
/**
* Return true if this query should use/check the query cache.
diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java
index b14c09953..602e9b778 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java
@@ -1047,8 +1047,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
}
}
- if (!desc.calculateUseCache(query.isUseBeanCache())) {
- // not using bean cache
+ if (!query.isUseBeanCache()) {
return null;
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java
index fe93f16b0..428dad377 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java
@@ -425,7 +425,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe
}
public boolean isUseBeanCache() {
- return beanDescriptor.calculateUseCache(query.isUseBeanCache());
+ return query.isUseBeanCache();
}
/**
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java
index fd112a940..e94fa62c7 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java
@@ -867,10 +867,6 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType {
}
}
- public boolean calculateUseCache(Boolean queryUseCache) {
- return (queryUseCache != null) ? queryUseCache : isBeanCaching();
- }
-
/**
* Return the cache options.
*/
diff --git a/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadContext.java b/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadContext.java
index 608236266..fde0ebde4 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadContext.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/loadcontext/DLoadContext.java
@@ -104,7 +104,7 @@ public class DLoadContext implements LoadContext {
this.readOnly = query.isReadOnly();
this.disableReadAudit = query.isDisableReadAudit();
this.disableLazyLoading = query.isDisableLazyLoading();
- this.excludeBeanCache = Boolean.FALSE.equals(query.isUseBeanCache());
+ this.excludeBeanCache = query.isExcludeBeanCache();
this.useProfiling = query.getProfilingListener() != null;
ObjectGraphNode parentNode = query.getParentNode();
diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java
index 34ebb9a87..e139b10bd 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java
@@ -189,7 +189,7 @@ public class DefaultOrmQuery implements SpiQuery {
private boolean loadBeanCache;
- private Boolean useBeanCache;
+ private boolean excludeBeanCache;
private Boolean useQueryCache;
@@ -330,6 +330,7 @@ public class DefaultOrmQuery implements SpiQuery {
* This table alias is for a @History entity involved in the query and as
* such we need to add a 'as of predicate' to the query using this alias.
*/
+ @Override
public void addAsOfTableAlias(String tableAlias) {
if (asOfTableAlias == null) {
asOfTableAlias = new ArrayList();
@@ -337,20 +338,24 @@ public class DefaultOrmQuery implements SpiQuery {
asOfTableAlias.add(tableAlias);
}
+ @Override
public List getAsOfTableAlias() {
return asOfTableAlias;
}
+ @Override
public Timestamp getAsOf() {
return asOf;
}
+ @Override
public DefaultOrmQuery asOf(Timestamp asOfDateTime) {
this.temporalMode = (asOfDateTime != null) ? TemporalMode.AS_OF : TemporalMode.CURRENT;
this.asOf = asOfDateTime;
return this;
}
+ @Override
public DefaultOrmQuery asDraft() {
this.temporalMode = TemporalMode.DRAFT;
return this;
@@ -367,10 +372,12 @@ public class DefaultOrmQuery implements SpiQuery {
return this;
}
+ @Override
public RawSql getRawSql() {
return rawSql;
}
+ @Override
public DefaultOrmQuery setRawSql(RawSql rawSql) {
this.rawSql = rawSql;
return this;
@@ -381,19 +388,23 @@ public class DefaultOrmQuery implements SpiQuery {
return lazyLoadBatchSize;
}
+ @Override
public Query setLazyLoadBatchSize(int lazyLoadBatchSize) {
this.lazyLoadBatchSize = lazyLoadBatchSize;
return this;
}
+ @Override
public String getLazyLoadProperty() {
return lazyLoadProperty;
}
+ @Override
public void setLazyLoadProperty(String lazyLoadProperty) {
this.lazyLoadProperty = lazyLoadProperty;
}
+ @Override
public ExpressionFactory getExpressionFactory() {
return expressionFactory;
}
@@ -411,6 +422,7 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Return the extra joins required to support the where clause for 'Many' properties.
*/
+ @Override
public ManyWhereJoins getManyWhereJoins() {
return manyWhereJoins;
}
@@ -419,6 +431,7 @@ public class DefaultOrmQuery implements SpiQuery {
* Return true if select all properties was used to ensure the property invoking a lazy load was
* included in the query.
*/
+ @Override
public boolean selectAllForLazyLoadProperty() {
if (lazyLoadProperty != null) {
if (!detail.containsProperty(lazyLoadProperty)) {
@@ -461,6 +474,7 @@ public class DefaultOrmQuery implements SpiQuery {
return detail.removeSecondaryLazyQueries();
}
+ @Override
public void setLazyLoadManyPath(String lazyLoadManyPath) {
this.lazyLoadManyPath = lazyLoadManyPath;
}
@@ -495,28 +509,34 @@ public class DefaultOrmQuery implements SpiQuery {
this.detail = detail;
}
+ @Override
public void setDefaultSelectClause() {
detail.setDefaultSelectClause(beanDescriptor);
}
+ @Override
public void setDetail(OrmQueryDetail detail) {
this.detail = detail;
}
+ @Override
public boolean tuneFetchProperties(OrmQueryDetail tunedDetail) {
return detail.tuneFetchProperties(tunedDetail);
}
+ @Override
public OrmQueryDetail getDetail() {
return detail;
}
+ @Override
public ExpressionList filterMany(String prop) {
OrmQueryProperties chunk = detail.getChunk(prop, true);
return chunk.filterMany(this);
}
+ @Override
public void setFilterMany(String prop, ExpressionList> filterMany) {
if (filterMany != null) {
OrmQueryProperties chunk = detail.getChunk(prop, true);
@@ -527,6 +547,7 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Setup to be a delete query.
*/
+ @Override
public void setDelete() {
// unset any paging and select on the id in the case where the query
// includes joins and we use - delete ... where id in (...)
@@ -540,12 +561,14 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Set the select clause to select the Id property.
*/
+ @Override
public void setSelectId() {
// clear select and fetch joins..
detail.clear();
select(beanDescriptor.getIdBinder().getIdProperty());
}
+ @Override
public NaturalKeyBindParam getNaturalKeyBindParam() {
NaturalKeyBindParam namedBind = null;
if (bindParams != null) {
@@ -577,10 +600,12 @@ public class DefaultOrmQuery implements SpiQuery {
return null;
}
+ @Override
public DefaultOrmQuery copy() {
return copy(server);
}
+ @Override
public DefaultOrmQuery copy(EbeanServer server) {
DefaultOrmQuery copy = new DefaultOrmQuery(beanDescriptor, server, expressionFactory, (String) null);
@@ -598,7 +623,7 @@ public class DefaultOrmQuery implements SpiQuery {
copy.mapKey = mapKey;
copy.id = id;
copy.loadBeanCache = loadBeanCache;
- copy.useBeanCache = useBeanCache;
+ copy.excludeBeanCache = excludeBeanCache;
copy.useQueryCache = useQueryCache;
copy.readOnly = readOnly;
copy.sqlSelect = sqlSelect;
@@ -637,26 +662,32 @@ public class DefaultOrmQuery implements SpiQuery {
return this;
}
+ @Override
public PersistenceContextScope getPersistenceContextScope() {
return persistenceContextScope;
}
+ @Override
public Type getType() {
return type;
}
+ @Override
public void setType(Type type) {
this.type = type;
}
+ @Override
public String getLoadDescription() {
return loadDescription;
}
+ @Override
public String getLoadMode() {
return loadMode;
}
+ @Override
public void setLoadDescription(String loadMode, String loadDescription) {
this.loadMode = loadMode;
this.loadDescription = loadDescription;
@@ -669,6 +700,7 @@ public class DefaultOrmQuery implements SpiQuery {
* Transaction is used (transaction scoped persistence context).
*
*/
+ @Override
public PersistenceContext getPersistenceContext() {
return persistenceContext;
}
@@ -680,6 +712,7 @@ public class DefaultOrmQuery implements SpiQuery {
* Transaction is used (transaction scoped persistence context).
*
*/
+ @Override
public void setPersistenceContext(PersistenceContext persistenceContext) {
this.persistenceContext = persistenceContext;
}
@@ -697,26 +730,32 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Return true if the query detail has neither select or joins specified.
*/
+ @Override
public boolean isDetailEmpty() {
return detail.isEmpty();
}
+ @Override
public boolean isAutoTuned() {
return autoTuned;
}
+ @Override
public void setAutoTuned(boolean autoTuned) {
this.autoTuned = autoTuned;
}
+ @Override
public Boolean isAutoTune() {
return sqlSelect ? Boolean.FALSE : autoTune;
}
+ @Override
public boolean isForUpdate() {
return forUpdate;
}
+ @Override
public DefaultOrmQuery setAutoTune(boolean autoTune) {
this.autoTune = autoTune;
return this;
@@ -748,6 +787,7 @@ public class DefaultOrmQuery implements SpiQuery {
return temporalMode;
}
+ @Override
public boolean isAsOfQuery() {
return asOf != null;
}
@@ -762,22 +802,27 @@ public class DefaultOrmQuery implements SpiQuery {
return TemporalMode.SOFT_DELETED == temporalMode;
}
+ @Override
public void setMode(Mode mode) {
this.mode = mode;
}
+ @Override
public boolean isUsageProfiling() {
return usageProfiling;
}
+ @Override
public void setUsageProfiling(boolean usageProfiling) {
this.usageProfiling = usageProfiling;
}
+ @Override
public void setLogSecondaryQuery(boolean logSecondaryQuery) {
this.logSecondaryQuery = logSecondaryQuery;
}
+ @Override
public boolean isLogSecondaryQuery() {
return logSecondaryQuery;
}
@@ -789,6 +834,7 @@ public class DefaultOrmQuery implements SpiQuery {
return loggedSecondaryQueries;
}
+ @Override
public void logSecondaryQuery(SpiQuery> query) {
if (loggedSecondaryQueries == null) {
loggedSecondaryQueries = new ArrayList>();
@@ -796,14 +842,17 @@ public class DefaultOrmQuery implements SpiQuery {
loggedSecondaryQueries.add(query);
}
+ @Override
public void setParentNode(ObjectGraphNode parentNode) {
this.parentNode = parentNode;
}
+ @Override
public ObjectGraphNode getParentNode() {
return parentNode;
}
+ @Override
public ObjectGraphNode setOrigin(CallStack callStack) {
// create a 'origin' which links this query to the profiling information
@@ -845,6 +894,7 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Prepare the query which prepares any expressions (sub-query expressions etc) and calculates the query plan key.
*/
+ @Override
public CQueryPlanKey prepare(BeanQueryRequest> request) {
prepareExpressions(request);
@@ -871,6 +921,7 @@ public class DefaultOrmQuery implements SpiQuery {
* Used with queryPlanHash() to get a unique hash for a query.
*
*/
+ @Override
public int queryBindHash() {
int hc = (id == null ? 0 : id.hashCode());
hc = hc * 31 + (whereExpressions == null ? 0 : whereExpressions.queryBindHash());
@@ -889,6 +940,7 @@ public class DefaultOrmQuery implements SpiQuery {
* values) before.
*
*/
+ @Override
public HashQuery queryHash() {
// calculateQueryPlanHash is called just after potential AutoTune tuning
// so queryPlanHash is calculated well before this method is called
@@ -900,14 +952,17 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Return the query name.
*/
+ @Override
public String getName() {
return name;
}
+ @Override
public boolean isSqlSelect() {
return sqlSelect;
}
+ @Override
public boolean isRawSql() {
return rawSql != null;
}
@@ -915,6 +970,7 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Return any additional where clauses.
*/
+ @Override
public String getAdditionalWhere() {
return additionalWhere;
}
@@ -922,6 +978,7 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Return the timeout.
*/
+ @Override
public int getTimeout() {
return timeout;
}
@@ -929,10 +986,12 @@ public class DefaultOrmQuery implements SpiQuery {
/**
* Return any additional having clauses.
*/
+ @Override
public String getAdditionalHaving() {
return additionalHaving;
}
+ @Override
public boolean hasMaxRowsOrFirstRow() {
return maxRows > 0 || firstRow > 0;
}
@@ -952,45 +1011,58 @@ public class DefaultOrmQuery implements SpiQuery {
return versionsEnd;
}
+ @Override
public Boolean isReadOnly() {
return readOnly;
}
+ @Override
public DefaultOrmQuery setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
return this;
}
- public Boolean isUseBeanCache() {
+ public boolean isExcludeBeanCache() {
// not using L2 cache for asDraft() query
- return isAsDraft() ? Boolean.FALSE : useBeanCache;
+ return excludeBeanCache || isAsDraft() ;
}
+ @Override
+ public boolean isUseBeanCache() {
+ return !isExcludeBeanCache() && beanDescriptor.isBeanCaching();
+ }
+
+ @Override
public boolean isUseQueryCache() {
// not using L2 cache for asDraft() query
return !isAsDraft() && Boolean.TRUE.equals(useQueryCache);
}
- public DefaultOrmQuery setUseCache(boolean useBeanCache) {
- this.useBeanCache = useBeanCache;
+ @Override
+ public DefaultOrmQuery setUseCache(boolean useCache) {
+ this.excludeBeanCache = !useCache;
return this;
}
+ @Override
public DefaultOrmQuery setUseQueryCache(boolean useQueryCache) {
this.useQueryCache = useQueryCache;
return this;
}
+ @Override
public boolean isLoadBeanCache() {
// not using L2 cache for asDraft() query
return !isAsDraft() && loadBeanCache;
}
+ @Override
public DefaultOrmQuery setLoadBeanCache(boolean loadBeanCache) {
this.loadBeanCache = loadBeanCache;
return this;
}
+ @Override
public DefaultOrmQuery setTimeout(int secs) {
this.timeout = secs;
return this;
@@ -1010,23 +1082,28 @@ public class DefaultOrmQuery implements SpiQuery {
this.rawWhereClause = rawWhereClause;
}
+ @Override
public DefaultOrmQuery select(String columns) {
detail.select(columns);
return this;
}
+ @Override
public DefaultOrmQuery fetch(String property) {
return fetch(property, null, null);
}
+ @Override
public DefaultOrmQuery fetch(String property, FetchConfig joinConfig) {
return fetch(property, null, joinConfig);
}
+ @Override
public DefaultOrmQuery fetch(String property, String columns) {
return fetch(property, columns, null);
}
+ @Override
public DefaultOrmQuery fetch(String property, String columns, FetchConfig config) {
detail.fetch(property, columns, config);
return this;
@@ -1037,6 +1114,7 @@ public class DefaultOrmQuery implements SpiQuery {
return server.delete(this, null);
}
+ @Override
public List