diff --git a/src/main/java/io/ebeaninternal/api/BindParams.java b/src/main/java/io/ebeaninternal/api/BindParams.java index b034fb2b1..53ea7dcf9 100644 --- a/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/src/main/java/io/ebeaninternal/api/BindParams.java @@ -1,5 +1,6 @@ package io.ebeaninternal.api; +import io.ebeaninternal.server.persist.MultiValueWrapper; import io.ebeaninternal.server.querydefn.NaturalKeyBindParam; import java.io.Serializable; @@ -154,6 +155,10 @@ public class BindParams implements Serializable { public void setParameter(int position, Object value) { Param p = getParam(position); + if (value instanceof Collection) { + // use of postgres ANY with positioned parameter + value = new MultiValueWrapper((Collection)value); + } p.setInValue(value); } diff --git a/src/test/java/io/ebean/DtoQueryTest.java b/src/test/java/io/ebean/DtoQueryTest.java index 7957559dc..f31350b30 100644 --- a/src/test/java/io/ebean/DtoQueryTest.java +++ b/src/test/java/io/ebean/DtoQueryTest.java @@ -1,5 +1,7 @@ package io.ebean; +import io.ebean.annotation.ForPlatform; +import io.ebean.annotation.Platform; import io.ebean.meta.BasicMetricVisitor; import io.ebean.meta.MetaQueryMetric; import org.ebeantest.LoggedSqlCollector; @@ -8,6 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tests.model.basic.ResetBasicData; +import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -98,6 +101,48 @@ public class DtoQueryTest extends BaseTestCase { } + @ForPlatform(Platform.POSTGRES) + @Test + public void dto_bindList_usingPostrgesAnyWithPositionedParameter() { + + ResetBasicData.reset(); + + List ids = Arrays.asList(1, 2); + + List list = server().findDto(DCust.class, "select id, name from o_customer where id = any(?)") + .setParameter(1, ids) + .findList(); + + assertThat(list).isNotEmpty(); + + list = server().findDto(DCust.class, "select id, name from o_customer where id in (:idList)") + .setParameter("idList", ids) + .findList(); + + assertThat(list).isNotEmpty(); + } + + @ForPlatform(Platform.POSTGRES) + @Test + public void sql_bindListParam_usingPostrgesAnyWithPositionedParameter() { + + ResetBasicData.reset(); + + List ids = Arrays.asList(1, 2); + + List list = server().createSqlQuery("select id, name from o_customer where id = any(?)") + .setParameter(1, ids) + .findList(); + + assertThat(list).isNotEmpty(); + + list = server().createSqlQuery("select id, name from o_customer where id in (:idList)") + .setParameter("idList", ids) + .findList(); + + assertThat(list).isNotEmpty(); + } + @Test public void dto_queryPlanHits() { diff --git a/src/test/java/org/tests/basic/type/TestSqlRowUUID.java b/src/test/java/org/tests/basic/type/TestSqlRowUUID.java index 2ebcb4db0..1997af5d2 100644 --- a/src/test/java/org/tests/basic/type/TestSqlRowUUID.java +++ b/src/test/java/org/tests/basic/type/TestSqlRowUUID.java @@ -4,9 +4,11 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.SqlQuery; import io.ebean.SqlRow; -import org.tests.model.basic.TUuidEntity; import org.junit.Test; +import org.tests.model.basic.TUuidEntity; +import java.util.Arrays; +import java.util.List; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -41,5 +43,19 @@ public class TestSqlRowUUID extends BaseTestCase { assertThat(value).isEqualTo(e.getId()); + if (isPostgres()) { + usingPostrgesAnyWithPositionedParameter_needsExplicitCast(e); + } + } + + private void usingPostrgesAnyWithPositionedParameter_needsExplicitCast(TUuidEntity e) { + + List ids = Arrays.asList(e.getId(), UUID.randomUUID()); + + List result = Ebean.createSqlQuery("select id from tuuid_entity where id = any(?::uuid[])") + .setParameter(1, ids) + .findList(); + + assertThat(result).hasSize(1); } }