diff --git a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java index 27572d037..093fdc2b9 100644 --- a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java @@ -96,7 +96,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe public String getDBLikeClause() { return ebeanServer.getDatabasePlatform().getLikeClause(); } - + /** * Return the database platform escaped like string. */ @@ -461,7 +461,8 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe * Try to get the query result from the query cache. */ @Override - public BeanCollection getFromQueryCache() { + @SuppressWarnings("unchecked") + public Object getFromQueryCache() { if (!query.isUseQueryCache()) { return null; @@ -469,16 +470,18 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe cacheKey = query.queryHash(); - BeanCollection cached = beanDescriptor.queryCacheGet(cacheKey); + Object cached = beanDescriptor.queryCacheGet(cacheKey); if (cached != null && isAuditReads() && readAuditQueryType()) { - // raw sql can't use L2 cache so normal queries only in here - Collection actualDetails = cached.getActualDetails(); - List ids = new ArrayList<>(actualDetails.size()); - for (T bean : actualDetails) { - ids.add(beanDescriptor.getIdForJson(bean)); + if (cached instanceof BeanCollection) { + // raw sql can't use L2 cache so normal queries only in here + Collection actualDetails = ((BeanCollection)cached).getActualDetails(); + List ids = new ArrayList<>(actualDetails.size()); + for (T bean : actualDetails) { + ids.add(beanDescriptor.getIdForJson(bean)); + } + beanDescriptor.readAuditMany(queryPlanKey.getPartialKey(), "l2-query-cache", ids); } - beanDescriptor.readAuditMany(queryPlanKey.getPartialKey(), "l2-query-cache", ids); } return cached; @@ -502,7 +505,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe } } - public void putToQueryCache(BeanCollection queryResult) { + public void putToQueryCache(Object queryResult) { beanDescriptor.queryCachePut(cacheKey, queryResult); } diff --git a/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java index ff6c8a285..978fd8bde 100644 --- a/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java @@ -117,13 +117,13 @@ public interface SpiOrmQueryRequest extends DocQueryRequest { /** * Try to get the query result from the query cache. */ - BeanCollection getFromQueryCache(); + Object getFromQueryCache(); /** * Return the Database platform like clause. */ String getDBLikeClause(); - + /** * Escapes a string to use it as exact match in Like clause. */ diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 8f07c2542..528133a45 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1163,15 +1163,15 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { /** * Get a query result from the query cache. */ - public BeanCollection queryCacheGet(Object id) { + public Object queryCacheGet(Object id) { return cacheHelp.queryCacheGet(id); } /** * Put a query result into the query cache. */ - public void queryCachePut(Object id, BeanCollection query) { - cacheHelp.queryCachePut(id, query); + public void queryCachePut(Object id, Object queryResult) { + cacheHelp.queryCachePut(id, queryResult); } /** diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index f06436090..b7d23ed67 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -183,33 +183,32 @@ final class BeanDescriptorCacheHelp { /** * Get a query result from the query cache. */ - @SuppressWarnings("unchecked") - BeanCollection queryCacheGet(Object id) { + Object queryCacheGet(Object id) { if (queryCache == null) { throw new IllegalStateException("No query cache enabled on " + desc + ". Need explicit @Cache(enableQueryCache=true)"); } - BeanCollection list = (BeanCollection) queryCache.get(id); + Object queryResult = queryCache.get(id); if (queryLog.isDebugEnabled()) { - if (list == null) { + if (queryResult == null) { queryLog.debug(" GET {}({}) - cache miss", cacheName, id); } else { queryLog.debug(" GET {}({}) - hit", cacheName, id); } } - return list; + return queryResult; } /** * Put a query result into the query cache. */ - void queryCachePut(Object id, BeanCollection query) { + void queryCachePut(Object id, Object queryResult) { if (queryCache == null) { throw new IllegalStateException("No query cache enabled on " + desc + ". Need explicit @Cache(enableQueryCache=true)"); } if (queryLog.isDebugEnabled()) { queryLog.debug(" PUT {}({})", cacheName, id); } - queryCache.put(id, query); + queryCache.put(id, queryResult); } diff --git a/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java index b3db79734..5e5e3fc87 100644 --- a/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -83,7 +83,12 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine { @Override public List findSingleAttributeList(OrmQueryRequest request) { flushJdbcBatchOnQuery(request); - return queryEngine.findSingleAttributeList(request); + List result = queryEngine.findSingleAttributeList(request); + if (!result.isEmpty() && request.getQuery().isUseQueryCache()) { + // load the query result into the query cache + request.putToQueryCache(result); + } + return result; } @Override diff --git a/src/test/java/org/tests/cache/TestQueryCache.java b/src/test/java/org/tests/cache/TestQueryCache.java index 58ae63923..f7a678146 100644 --- a/src/test/java/org/tests/cache/TestQueryCache.java +++ b/src/test/java/org/tests/cache/TestQueryCache.java @@ -47,6 +47,43 @@ public class TestQueryCache extends BaseTestCase { assertThat(list2.get(0).getColumnB()).isEqualTo("10"); } + @Test + public void findSingleAttribute() { + + new EColAB("03", "SingleAttribute").save(); + new EColAB("03", "SingleAttribute").save(); + + List colA_first = Ebean.getServer(null) + .find(EColAB.class) + .setUseQueryCache(true) + .setDistinct(true) + .select("columnA") + .where() + .eq("columnB", "SingleAttribute") + .findSingleAttributeList(); + + List colA_Second = Ebean.getServer(null) + .find(EColAB.class) + .setUseQueryCache(true) + .setDistinct(true) + .select("columnA") + .where() + .eq("columnB", "SingleAttribute") + .findSingleAttributeList(); + + assertThat(colA_Second).isSameAs(colA_first); + + List colA_NotDistinct = Ebean.getServer(null) + .find(EColAB.class) + .setUseQueryCache(true) + .select("columnA") + .where() + .eq("columnB", "SingleAttribute") + .findSingleAttributeList(); + + assertThat(colA_Second).isNotSameAs(colA_NotDistinct); + } + @Test @SuppressWarnings("unchecked") public void test() { diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml index 192b80826..a82fd3e8d 100644 --- a/src/test/resources/logback-test.xml +++ b/src/test/resources/logback-test.xml @@ -79,14 +79,14 @@ - - - + + + - - - - + + + +