From 8d29a3a575776d00de15c81e3ddd0c5620ca0f11 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 25 Jan 2022 21:27:32 +1300 Subject: [PATCH] Bind LocalDate directly using JDBC driver to convert This addresses issues with dates before 1900-01-01 with H2Database --- .../java/io/ebean/core/type/DataReader.java | 2 ++ .../server/type/RsetDataReader.java | 5 +++++ .../server/type/ScalarTypeJodaLocalDate.java | 21 +++++++++++++++++-- .../server/type/ScalarTypeLocalDate.java | 17 +++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java b/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java index ef61b9122..d9a1ade92 100644 --- a/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java +++ b/ebean-core-type/src/main/java/io/ebean/core/type/DataReader.java @@ -47,6 +47,8 @@ public interface DataReader { Object getObject() throws SQLException; + T getObject(Class cls) throws SQLException; + InputStream getBinaryStream() throws SQLException; /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java index b85c8e688..574f37615 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/RsetDataReader.java @@ -73,6 +73,11 @@ public class RsetDataReader implements DataReader { return rset.getObject(pos()); } + @Override + public T getObject(Class cls) throws SQLException { + return rset.getObject(pos(), cls); + } + @Override public BigDecimal getBigDecimal() throws SQLException { return rset.getBigDecimal(pos()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java index a7f385442..eb10a80bb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java @@ -1,11 +1,14 @@ package io.ebeaninternal.server.type; import io.ebean.config.JsonConfig; +import io.ebean.core.type.DataBinder; +import io.ebean.core.type.DataReader; import io.ebeaninternal.server.core.BasicTypeConverter; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import java.sql.Date; +import java.sql.SQLException; import java.sql.Types; /** @@ -40,7 +43,7 @@ final class ScalarTypeJodaLocalDate extends ScalarTypeBaseDate { @SuppressWarnings("deprecation") @Override public Date convertToDate(LocalDate value) { - return new Date(value .getYear() - 1900, value .getMonthOfYear() - 1, value .getDayOfMonth()); + return new Date(value.getYear() - 1900, value.getMonthOfYear() - 1, value.getDayOfMonth()); } @Override @@ -54,9 +57,23 @@ final class ScalarTypeJodaLocalDate extends ScalarTypeBaseDate { @Override public LocalDate toBeanType(Object value) { if (value instanceof java.util.Date) { - return LocalDate.fromDateFields((java.util.Date)value); + return LocalDate.fromDateFields((java.util.Date) value); } return (LocalDate) value; } + @Override + public void bind(DataBinder binder, LocalDate value) throws SQLException { + if (value == null) { + binder.setNull(Types.DATE); + } else { + binder.setObject(java.time.LocalDate.of(value.getYear(), value.getMonthOfYear(), value.getDayOfMonth())); + } + } + + @Override + public LocalDate read(DataReader reader) throws SQLException { + java.time.LocalDate jtDate = reader.getObject(java.time.LocalDate.class); + return jtDate == null ? null : new org.joda.time.LocalDate(jtDate.getYear(), jtDate.getMonthValue(), jtDate.getDayOfMonth()); + } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDate.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDate.java index 630fe73a3..1e298ecac 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeLocalDate.java @@ -1,9 +1,12 @@ package io.ebeaninternal.server.type; import io.ebean.config.JsonConfig; +import io.ebean.core.type.DataBinder; +import io.ebean.core.type.DataReader; import io.ebeaninternal.server.core.BasicTypeConverter; import java.sql.Date; +import java.sql.SQLException; import java.sql.Timestamp; import java.sql.Types; import java.time.LocalDate; @@ -61,4 +64,18 @@ final class ScalarTypeLocalDate extends ScalarTypeBaseDate { return (LocalDate) value; } + @Override + public void bind(DataBinder binder, LocalDate value) throws SQLException { + if (value == null) { + binder.setNull(Types.DATE); + } else { + binder.setObject(value); + } + } + + @Override + public LocalDate read(DataReader reader) throws SQLException { + return reader.getObject(LocalDate.class); + } + }