diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index 07e3ccaf0..8c6ddaf3d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -1107,12 +1107,13 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { @Override @SuppressWarnings({"unchecked", "rawtypes"}) public Map findMap(Query query, @Nullable Transaction transaction) { - SpiOrmQueryRequest request = createQueryRequest(Type.MAP, query, transaction); + SpiOrmQueryRequest request = buildQueryRequest(Type.MAP, query, transaction); request.resetBeanCacheAutoMode(false); if ((transaction == null || !transaction.isSkipCache()) && request.getFromBeanCache()) { // hit bean cache and got all results from cache return request.beanCacheHitsAsMap(); } + request.prepareQuery(); Object result = request.getFromQueryCache(); if (result != null) { return (Map) result; diff --git a/ebean-test/src/test/java/org/tests/cache/TestBeanCache.java b/ebean-test/src/test/java/org/tests/cache/TestBeanCache.java index 16c38fa30..7a81635cd 100644 --- a/ebean-test/src/test/java/org/tests/cache/TestBeanCache.java +++ b/ebean-test/src/test/java/org/tests/cache/TestBeanCache.java @@ -1,11 +1,12 @@ package org.tests.cache; -import io.ebean.xtest.BaseTestCase; import io.ebean.DB; +import io.ebean.Query; import io.ebean.Transaction; import io.ebean.cache.ServerCache; import io.ebean.cache.ServerCacheStatistics; import io.ebean.test.LoggedSql; +import io.ebean.xtest.BaseTestCase; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,10 +55,39 @@ public class TestBeanCache extends BaseTestCase { assertThat(sql).isEmpty(); } + @Test + public void idsInFindMap() { + + List beans = createBeans(Arrays.asList("m0", "m1", "m2", "m3", "m4", "m5", "m6")); + List ids = beans.stream().map(OCachedBean::getId).collect(Collectors.toList()); + beanCache.clear(); + beanCache.statistics(true); + Query query = DB.find(OCachedBean.class).setUseCache(true); + + // Test findIds + LoggedSql.start(); + query.copy() + .where().idIn(ids.subList(0, 1)) + .findMap(); // cache key is: 3/d[{/c1000}]/w[List[IdIn[?1],]] + assertThat(LoggedSql.stop().get(0)).contains("in (?)"); + + LoggedSql.start(); + query.copy() + .where().idIn(ids.subList(0, 4)) + .findMap(); // cache key is: 3/d[{/c1000}]/w[List[IdIn[?5],]] + assertThat(LoggedSql.stop().get(0)).contains("in (?,?,?,?,?)"); + + LoggedSql.start(); + query.copy() + .where().idIn(ids.subList(2, 6)) + .findMap(); // same cache key as above and same SQL above + assertThat(LoggedSql.stop().get(0)).contains("in (?,?,?,?,?)"); + } + @Test public void idsIn_explicitCache_expect_cachePut() { - List beans = createBeans(Arrays.asList("k0","k1")); + List beans = createBeans(Arrays.asList("k0", "k1")); List ids = beans.stream().map(OCachedBean::getId).collect(Collectors.toList()); beanCache.clear(); @@ -183,7 +213,7 @@ public class TestBeanCache extends BaseTestCase { Country country = DB.find(Country.class) .where() - .eq("name","NotValid") + .eq("name", "NotValid") .findOne(); assertThat(country).isNull();