From fc26765a7e9d138164d8a2bc5e5b7ee35bdcc343 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 4 Oct 2018 22:51:51 +1300 Subject: [PATCH] #1499 - findNative with findIds (or findSingleAttributeList with id property) throws ArrayIndexOutOfBoundsException --- .../server/query/SqlTreeNodeBean.java | 5 ++- .../server/querydefn/DefaultOrmQuery.java | 1 + .../org/tests/query/TestQueryFindNative.java | 31 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java b/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java index 9bafd1317..c67d58600 100644 --- a/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java +++ b/src/main/java/io/ebeaninternal/server/query/SqlTreeNodeBean.java @@ -148,7 +148,10 @@ class SqlTreeNodeBean implements SqlTreeNode { public ScalarType getSingleAttributeScalarType() { if (properties == null || properties.length == 0) { // if we have no property ask first children (in a distinct select with join) - // if we have also no children, NPE happens anyway. + if (children.length == 0) { + // expected to be a findIds query + return desc.getIdBinder().getBeanProperty().getScalarType(); + } return children[0].getSingleAttributeScalarType(); } if (properties[0] instanceof STreePropertyAssocOne) { diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index b2f294b02..fb3be3605 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -769,6 +769,7 @@ public class DefaultOrmQuery implements SpiQuery { copy.mapKey = mapKey; copy.id = id; copy.label = label; + copy.nativeSql = nativeSql; copy.useBeanCache = useBeanCache; copy.useQueryCache = useQueryCache; copy.readOnly = readOnly; diff --git a/src/test/java/org/tests/query/TestQueryFindNative.java b/src/test/java/org/tests/query/TestQueryFindNative.java index 734eb1c76..12dc45a6f 100644 --- a/src/test/java/org/tests/query/TestQueryFindNative.java +++ b/src/test/java/org/tests/query/TestQueryFindNative.java @@ -1,6 +1,7 @@ package org.tests.query; import io.ebean.BaseTestCase; +import io.ebean.Ebean; import org.junit.Test; import org.tests.model.basic.Contact; import org.tests.model.basic.Customer; @@ -13,6 +14,36 @@ import static org.assertj.core.api.Assertions.assertThat; public class TestQueryFindNative extends BaseTestCase { + @Test + public void findIds() { + + ResetBasicData.reset(); + + String sql = "select c.id from contact c where c.first_name like ? "; + + List ids = Ebean.createSqlQuery(sql) + .setParameter(1, "J%") + .findSingleAttributeList(Integer.class); + + List idsScalar = + server() + .findNative(Contact.class, sql) + .setParameter(1, "J%") + .findSingleAttributeList(); + + List nativeIds = + server() + .findNative(Contact.class, sql) + .setParameter(1, "J%") + .findIds(); + + + assertThat(nativeIds).isNotEmpty(); + assertThat(nativeIds).containsAll(ids); + assertThat(idsScalar).containsAll(ids); + } + + @Test public void joinFromManyToOne() {