diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java index 9982124af..5617e752c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ArrayElementConverter.java @@ -17,7 +17,7 @@ interface ArrayElementConverter { T fromSerialized(Object rawValue); /** - * Convert the array element from it's DB array form. + * Convert the array element from its DB array form. */ T fromDbArray(Object rawValue); @@ -25,31 +25,12 @@ interface ArrayElementConverter { return objects; } - /** - * The UUID converter implementation. - */ ArrayElementConverter UUID = new UuidConverter(); - - /** - * The String converter implementation. - */ ArrayElementConverter STRING = new StringConverter(); - - /** - * The Long converter implementation. - */ ArrayElementConverter LONG = new LongConverter(); - - /** - * The Integer converter implementation. - */ ArrayElementConverter INTEGER = new IntegerConverter(); - - /** - * The Double converter implementation. - */ ArrayElementConverter DOUBLE = new DoubleConverter(); - + ArrayElementConverter FLOAT = new FloatConverter(); ArrayElementConverter BIG_DECIMAL = new BigDecimalConverter(); class LongConverter implements ArrayElementConverter { @@ -86,6 +67,23 @@ interface ArrayElementConverter { } } + class FloatConverter implements ArrayElementConverter { + + @Override + public Float fromSerialized(Object rawValue) { + return fromDbArray(rawValue); + } + + @Override + public Float fromDbArray(Object rawValue) { + if (rawValue instanceof Float) { + return (Float) rawValue; + } else { + return ((Number) rawValue).floatValue(); + } + } + } + class DoubleConverter implements ArrayElementConverter { @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java index fdeef6a30..56ec0127e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java @@ -57,6 +57,9 @@ class ScalarTypeArrayList extends ScalarTypeArrayBase implements ScalarTyp if (valueType.equals(Integer.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayList(nullable, "integer", DocPropertyType.INTEGER, ArrayElementConverter.INTEGER)); } + if (valueType.equals(Float.class)) { + return cache.computeIfAbsent(key, s -> new ScalarTypeArrayList(nullable, "float4", DocPropertyType.DOUBLE, ArrayElementConverter.FLOAT)); + } if (valueType.equals(Double.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayList(nullable, "float", DocPropertyType.DOUBLE, ArrayElementConverter.DOUBLE)); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java index 6e16fb018..c0651ded8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayListH2.java @@ -48,6 +48,9 @@ final class ScalarTypeArrayListH2 extends ScalarTypeArrayList { if (valueType.equals(Integer.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayListH2(nullable, "integer", DocPropertyType.INTEGER, ArrayElementConverter.INTEGER)); } + if (valueType.equals(Float.class)) { + return cache.computeIfAbsent(key, s -> new ScalarTypeArrayListH2(nullable, "real", DocPropertyType.DOUBLE, ArrayElementConverter.FLOAT)); + } if (valueType.equals(Double.class)) { return cache.computeIfAbsent(key, s -> new ScalarTypeArrayListH2(nullable, "float", DocPropertyType.DOUBLE, ArrayElementConverter.DOUBLE)); } diff --git a/ebean-test/src/test/java/org/tests/model/array/EArrayBean.java b/ebean-test/src/test/java/org/tests/model/array/EArrayBean.java index 6ff468209..2dcd62e76 100644 --- a/ebean-test/src/test/java/org/tests/model/array/EArrayBean.java +++ b/ebean-test/src/test/java/org/tests/model/array/EArrayBean.java @@ -41,6 +41,11 @@ public class EArrayBean { @DbArray List decimals; + @DbArray + List doubs; + @DbArray + List floats; + @DbArray List statuses; @@ -112,6 +117,22 @@ public class EArrayBean { this.decimals = decimals; } + public List getDoubs() { + return doubs; + } + + public void setDoubs(List doubs) { + this.doubs = doubs; + } + + public List getFloats() { + return floats; + } + + public void setFloats(List floats) { + this.floats = floats; + } + public List getStatuses() { return statuses; } diff --git a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java index 8d413c34c..2f04f31ac 100644 --- a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java +++ b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java @@ -43,6 +43,8 @@ class TestDbArray_basic extends BaseTestCase { bean.getOtherIds().add(96L); bean.getOtherIds().add(97L); bean.setDecimals(doubles); + bean.setDoubs(List.of(1.1d, 2.3d)); + bean.setFloats(List.of(1.01f, 2.02f)); bean.setStatuses(new ArrayList<>()); bean.getStatuses().add(EArrayBean.Status.ONE); bean.getStatuses().add(EArrayBean.Status.THREE); @@ -60,6 +62,8 @@ class TestDbArray_basic extends BaseTestCase { found = DB.find(EArrayBean.class, bean.getId()); assertThat(found.getPhoneNumbers()).containsExactly("4321", "9823"); + assertThat(found.getDoubs()).hasSize(2); + assertThat(found.getFloats()).hasSize(2); if (isPostgresCompatible()) { Query query = DB.find(EArrayBean.class) @@ -277,9 +281,9 @@ class TestDbArray_basic extends BaseTestCase { List phNumbers = bean.getPhoneNumbers(); phNumbers.add("4321"); phNumbers.add("9823"); - List doubs = bean.getDecimals(); - doubs.add(BigDecimal.valueOf(1.23)); - doubs.add(BigDecimal.valueOf(4.56)); + List decimals = bean.getDecimals(); + decimals.add(BigDecimal.valueOf(1.23)); + decimals.add(BigDecimal.valueOf(4.56)); DB.save(bean); // Data is saved correctly