#1227 - NPE when using L2 Query cache with findOne() or findOneOrEmpty()

This commit is contained in:
Rob Bygrave
2017-12-13 22:19:25 +13:00
parent e07bd8f736
commit 4a4134ee93
6 changed files with 56 additions and 18 deletions
@@ -369,7 +369,7 @@ public interface SpiQuery<T> extends Query<T>, TxnProfileEventCodes {
/**
* Reset AUTO mode to OFF for findList(). Expect explicit cache use with findList().
*/
void resetBeanCacheAutoMode();
void resetBeanCacheAutoMode(boolean findOne);
/**
* Collect natural key data for this query or null if the query does not match
@@ -1518,12 +1518,10 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
private <T> List<T> findList(Query<T> query, Transaction t, boolean findOne) {
SpiOrmQueryRequest<T> request = createQueryRequest(Type.LIST, query, t);
if (!findOne) {
request.resetBeanCacheAutoMode();
Object result = request.getFromQueryCache();
if (result != null) {
return (List<T>) result;
}
request.resetBeanCacheAutoMode(findOne);
Object result = request.getFromQueryCache();
if (result != null) {
return (List<T>) result;
}
if ((t == null || !t.isSkipCache()) && request.getFromBeanCache()) {
return request.getBeanCacheHits();
@@ -14,9 +14,12 @@ import io.ebean.event.BeanFindController;
import io.ebean.event.BeanQueryAdapter;
import io.ebean.event.BeanQueryRequest;
import io.ebean.text.json.JsonReadOptions;
import io.ebeaninternal.api.BeanCacheResult;
import io.ebeaninternal.api.CQueryPlanKey;
import io.ebeaninternal.api.HashQuery;
import io.ebeaninternal.api.LoadContext;
import io.ebeaninternal.api.NaturalKeyQueryData;
import io.ebeaninternal.api.NaturalKeySet;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.api.SpiQuery.Type;
@@ -30,9 +33,6 @@ import io.ebeaninternal.server.deploy.DeployPropertyParserMap;
import io.ebeaninternal.server.loadcontext.DLoadContext;
import io.ebeaninternal.server.query.CQueryPlan;
import io.ebeaninternal.server.query.CancelableQuery;
import io.ebeaninternal.api.BeanCacheResult;
import io.ebeaninternal.api.NaturalKeyQueryData;
import io.ebeaninternal.api.NaturalKeySet;
import io.ebeaninternal.server.transaction.DefaultPersistenceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -503,8 +503,8 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
}
@Override
public void resetBeanCacheAutoMode() {
query.resetBeanCacheAutoMode();
public void resetBeanCacheAutoMode(boolean findOne) {
query.resetBeanCacheAutoMode(findOne);
}
public boolean isBeanCachePut() {
@@ -134,7 +134,7 @@ public interface SpiOrmQueryRequest<T> extends DocQueryRequest<T> {
/**
* Reset Bean cache mode AUTO - require explicit setting for bean cache use with findList().
*/
void resetBeanCacheAutoMode();
void resetBeanCacheAutoMode(boolean findOne);
/**
* Return the Database platform like clause.
@@ -1104,12 +1104,12 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
@Override
public boolean isBeanCachePut() {
return beanDescriptor.isBeanCaching() && useBeanCache.isPut();
return useBeanCache.isPut() && beanDescriptor.isBeanCaching();
}
@Override
public boolean isBeanCacheGet() {
return beanDescriptor.isBeanCaching() && useBeanCache.isGet();
return useBeanCache.isGet() && beanDescriptor.isBeanCaching() ;
}
@Override
@@ -1118,9 +1118,11 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
}
@Override
public void resetBeanCacheAutoMode() {
public void resetBeanCacheAutoMode(boolean findOne) {
if (useBeanCache == CacheMode.AUTO) {
useBeanCache = CacheMode.OFF;
if (!findOne || useQueryCache != CacheMode.OFF) {
useBeanCache = CacheMode.OFF;
}
}
}