From 0905a507c60c05d01780656f5af8ec58ed060908 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sun, 11 Oct 2026 19:59:26 +1300 Subject: [PATCH] Fix DbArray support Non-native JSON-backed arrays for Integer (so MySQL, Oracle, SQLServer etc) Without this fix, a DbArray of List on the plaforms that do NOT natively support it like MySQL, Oracle, SQL Server fallback to a JSON array and this didn't support all the specific types like Integer. This adds the appropriate element converters when reading values, including Integer, Long, floating-point, BigDecimal, date/time, and UUID types. This prevents JSON numeric values from being returned as Long for List properties. --- .../type/PlatformArrayTypeJsonList.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java index 636d55b01b..7eeb22f3af 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/PlatformArrayTypeJsonList.java @@ -5,6 +5,9 @@ import io.ebean.core.type.ScalarType; import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; import java.util.UUID; /** @@ -30,6 +33,27 @@ public ScalarType typeFor(Type valueType, boolean nullable) { if (valueType.equals(UUID.class)) { return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.UUID, nullable, ArrayElementConverter.UUID); } + if (valueType.equals(Long.class)) { + return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.LONG, nullable, ArrayElementConverter.LONG); + } + if (valueType.equals(Integer.class)) { + return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.INTEGER, nullable, ArrayElementConverter.INTEGER); + } + if (valueType.equals(Double.class)) { + return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.DOUBLE, nullable, ArrayElementConverter.DOUBLE); + } + if (valueType.equals(Float.class)) { + return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.DOUBLE, nullable, ArrayElementConverter.FLOAT); + } + if (valueType.equals(BigDecimal.class)) { + return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.DOUBLE, nullable, ArrayElementConverter.BIG_DECIMAL); + } + if (valueType.equals(Instant.class)) { + return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.TEXT, nullable, ArrayElementConverter.INSTANT); + } + if (valueType.equals(LocalDate.class)) { + return new ScalarTypeJsonList.VarcharWithConverter(DocPropertyType.TEXT, nullable, ArrayElementConverter.LOCAL_DATE); + } return new ScalarTypeJsonList(java.sql.Types.VARCHAR, JsonStorage.VARCHAR, docType(valueType), nullable, MutationDetection.DEFAULT); }