From c11a3f99a0d93e5546d37bcb0689995d67301c4c Mon Sep 17 00:00:00 2001 From: Daniel Lindberg Date: Fri, 15 Jul 2022 07:42:52 +0200 Subject: [PATCH] Allow OffsetDateTime to be parsed from a Double value #457 --- .../type/util/ObjectMapperWrapper.java | 10 ++++- .../GenericOffsetDateTimeJsonTest.java | 37 ++++++++++++++++++- .../type/util/ObjectMapperWrapper.java | 10 ++++- .../GenericOffsetDateTimeJsonTest.java | 33 +++++++++++++++++ .../type/util/ObjectMapperWrapper.java | 10 ++++- .../GenericOffsetDateTimeJsonTest.java | 33 +++++++++++++++++ 6 files changed, 128 insertions(+), 5 deletions(-) diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java index 2ffedf89f..baf19eedc 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java @@ -11,6 +11,9 @@ import java.io.Serializable; import java.lang.reflect.Type; import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeParseException; +import java.util.Date; import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME; @@ -152,7 +155,12 @@ public static class OffsetDateTimeDeserializer extends JsonDeserializer[] entities() { return new Class[]{ - Event.class, + Event.class, }; } @Test public void test() { - OffsetDateTime dateTime = OffsetDateTime.of(2015, 10, 1, 9, 0 , 0, 0, ZoneOffset.ofHours(2)); + OffsetDateTime dateTime = OffsetDateTime.of(2015, 10, 1, 9, 0, 0, 0, ZoneOffset.ofHours(2)); doInJPA(entityManager -> { Location location = new Location(); @@ -50,6 +53,36 @@ public void test() { }); } + @Test + public void testWithDouble() { + OffsetDateTime dateTime = OffsetDateTime.of(2022, 7, 14, 11, 37, 0, 0, ZoneOffset.ofHours(0)); + + //2022-07-14T11:37Z + String dateAsDouble = "1657798620.121624"; + String json = String.format("{\n" + + "\"country\":\"Romania\",\n" + + "\"city\":\"Cluj-Napoca\",\n" + + "\"rentedAt\": %s\n" + + "}", dateAsDouble); + + doInJDBC(connection -> { + String sql = "INSERT INTO EVENT (ID, LOCATION) VALUES (1, ?::JSON)"; + try ( + PreparedStatement statement = connection.prepareStatement(sql); + ) { + statement.setObject(1, json); + statement.executeUpdate(); + } catch (SQLException e) { + fail(e.getMessage()); + } + }); + + doInJPA(entityManager -> { + Event event = entityManager.find(Event.class, 1L); + assertEquals(dateTime, event.getLocation().getRentedAt()); + }); + } + @Entity(name = "Event") @Table(name = "event") @TypeDef(defaultForType = Location.class, typeClass = JsonType.class) diff --git a/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java b/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java index 2ffedf89f..baf19eedc 100644 --- a/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java +++ b/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java @@ -11,6 +11,9 @@ import java.io.Serializable; import java.lang.reflect.Type; import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeParseException; +import java.util.Date; import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME; @@ -152,7 +155,12 @@ public static class OffsetDateTimeDeserializer extends JsonDeserializer { + String sql = "INSERT INTO EVENT (ID, LOCATION) VALUES (1, ?::JSON)"; + try ( + PreparedStatement statement = connection.prepareStatement(sql); + ) { + statement.setObject(1, json); + statement.executeUpdate(); + } catch (SQLException e) { + fail(e.getMessage()); + } + }); + + doInJPA(entityManager -> { + Event event = entityManager.find(Event.class, 1L); + assertEquals(dateTime, event.getLocation().getRentedAt()); + }); + } + @Entity(name = "Event") @Table(name = "event") @TypeDef(defaultForType = Location.class, typeClass = JsonType.class) diff --git a/hibernate-types-60/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java b/hibernate-types-60/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java index 2ffedf89f..baf19eedc 100644 --- a/hibernate-types-60/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java +++ b/hibernate-types-60/src/main/java/com/vladmihalcea/hibernate/type/util/ObjectMapperWrapper.java @@ -11,6 +11,9 @@ import java.io.Serializable; import java.lang.reflect.Type; import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeParseException; +import java.util.Date; import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME; @@ -152,7 +155,12 @@ public static class OffsetDateTimeDeserializer extends JsonDeserializer { + String sql = "INSERT INTO EVENT (ID, LOCATION) VALUES (1, ?::JSON)"; + try ( + PreparedStatement statement = connection.prepareStatement(sql); + ) { + statement.setObject(1, json); + statement.executeUpdate(); + } catch (SQLException e) { + fail(e.getMessage()); + } + }); + + doInJPA(entityManager -> { + Event event = entityManager.find(Event.class, 1L); + assertEquals(dateTime, event.getLocation().getRentedAt()); + }); + } + @Entity(name = "Event") @Table(name = "event") public static class Event {