diff --git a/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java b/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java index 1a1d45a79..17ee210bf 100644 --- a/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/clickhouse/ClickHousePlatform.java @@ -49,4 +49,10 @@ public class ClickHousePlatform extends DatabasePlatform { dbTypeMap.put(DbType.INET, new DbPlatformType("String", false)); dbTypeMap.put(DbType.CDIR, new DbPlatformType("String", false)); } + + @Override + public boolean isNativeArrayType() { + return true; + } + } diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java index 783793c72..8a08772ad 100644 --- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java +++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayBase.java @@ -18,13 +18,53 @@ abstract class ScalarTypeArrayBase extends ScalarTypeJsonCollection { return null; } else { try { - return fromArray((Object[]) array.getArray()); + return fromArray(convertArray(array.getArray())); } finally { array.free(); } } } + private Object[] convertArray(Object array) { + if (array instanceof Object[]) { + return (Object[]) array; + } + if (array instanceof long[]) { + return convertLongs((long[]) array); + } + if (array instanceof int[]) { + return convertInts((int[]) array); + } + if (array instanceof double[]) { + return convertDoubles((double[]) array); + } + throw new IllegalArgumentException("Unable to convert array " + array); + } + + private Object[] convertLongs(long[] o) { + Long[] list = new Long[o.length]; + for (int i = 0; i < o.length; i++) { + list[i] = o[i]; + } + return list; + } + + private Object[] convertInts(int[] o) { + Integer[] list = new Integer[o.length]; + for (int i = 0; i < o.length; i++) { + list[i] = o[i]; + } + return list; + } + + private Object[] convertDoubles(double[] o) { + Double[] list = new Double[o.length]; + for (int i = 0; i < o.length; i++) { + list[i] = o[i]; + } + return list; + } + protected abstract T fromArray(Object[] array1); }