From b8105190d1df666a2a4243db34f621d7a74c2715 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Tue, 22 Jan 2019 01:56:58 +1300 Subject: [PATCH] #1615 - findNative() with List/array named parameter throws error ... query plan key doesn't take bind count into account --- .../server/querydefn/DefaultOrmQuery.java | 4 ++-- .../org/tests/query/TestQueryFindNative.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index e0645c688..0f10c5201 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -1069,9 +1069,9 @@ public class DefaultOrmQuery implements SpiQuery { * Calculate the query hash for either AutoTune query tuning or Query Plan caching. */ CQueryPlanKey createQueryPlanKey() { - if (isNativeSql()) { - queryPlanKey = new NativeSqlQueryPlanKey(type.ordinal() + nativeSql + "-" + firstRow + "-" + maxRows); + String bindHash = (bindParams == null) ? "" : bindParams.calcQueryPlanHash(); + queryPlanKey = new NativeSqlQueryPlanKey(type.ordinal() + nativeSql + "-" + firstRow + "-" + maxRows + "-" + bindHash); } else { queryPlanKey = new OrmQueryPlanKey(planDescription(), maxRows, firstRow, rawSql); } diff --git a/src/test/java/org/tests/query/TestQueryFindNative.java b/src/test/java/org/tests/query/TestQueryFindNative.java index 4ad221231..c294c16c7 100644 --- a/src/test/java/org/tests/query/TestQueryFindNative.java +++ b/src/test/java/org/tests/query/TestQueryFindNative.java @@ -3,6 +3,7 @@ package org.tests.query; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.PagedList; +import org.assertj.core.util.Lists; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; import org.tests.model.basic.Contact; @@ -15,6 +16,24 @@ import static org.assertj.core.api.Assertions.assertThat; public class TestQueryFindNative extends BaseTestCase { + @Test + public void test_in_bindCount() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + String sql = "select id,first_name from contact where id in(:ids)"; + Ebean.findNative(Contact.class, sql).setParameter("ids", Lists.newArrayList(1, 2, 3)).findList(); + Ebean.findNative(Contact.class, sql).setParameter("ids", Lists.newArrayList(1, 2)).findList(); + + List loggedSql = LoggedSqlCollector.stop(); + assertThat(loggedSql).hasSize(2); + if (isH2()) { + assertThat(loggedSql.get(0)).contains("(?,?,?)"); + assertThat(loggedSql.get(1)).contains("(?,?)"); + } + } @Test public void findCount() {