From 9d54b264ad536ed8564afe3d337af693de3e713d Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Mon, 19 Apr 2021 17:04:57 +1200 Subject: [PATCH] #2219 - Compile error with ZonedDateTime and query beans - type argument java.time.ZonedDateTime is not within bounds of type-variable D --- .../io/ebean/typequery/PZonedDateTime.java | 50 +++++++++++++++++++ .../test/java/org/example/domain/Contact.java | 29 +++++++---- .../test/java/org/querytest/QContactTest.java | 4 +- .../querybean/generator/PropertyTypeMap.java | 6 +-- .../querybean/generator/PropertyTypeMap.java | 6 +-- 5 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 ebean-querybean/src/main/java/io/ebean/typequery/PZonedDateTime.java diff --git a/ebean-querybean/src/main/java/io/ebean/typequery/PZonedDateTime.java b/ebean-querybean/src/main/java/io/ebean/typequery/PZonedDateTime.java new file mode 100644 index 000000000..e233449ef --- /dev/null +++ b/ebean-querybean/src/main/java/io/ebean/typequery/PZonedDateTime.java @@ -0,0 +1,50 @@ +package io.ebean.typequery; + +import java.time.ZonedDateTime; + +/** + * ZonedDateTime property. + * + * @param the root query bean type + */ +public class PZonedDateTime extends PBaseCompareable { + + /** + * Construct with a property name and root instance. + * + * @param name property name + * @param root the root query bean instance + */ + public PZonedDateTime(String name, R root) { + super(name, root); + } + + /** + * Construct with additional path prefix. + */ + public PZonedDateTime(String name, R root, String prefix) { + super(name, root, prefix); + } + + /** + * Same as greater than. + * + * @param value the equal to bind value + * @return the root query bean instance + */ + public R after(ZonedDateTime value) { + expr().gt(_name, value); + return _root; + } + + /** + * Same as less than. + * + * @param value the equal to bind value + * @return the root query bean instance + */ + public R before(ZonedDateTime value) { + expr().lt(_name, value); + return _root; + } +} diff --git a/ebean-querybean/src/test/java/org/example/domain/Contact.java b/ebean-querybean/src/test/java/org/example/domain/Contact.java index 00035d80a..2b5fe9f53 100644 --- a/ebean-querybean/src/test/java/org/example/domain/Contact.java +++ b/ebean-querybean/src/test/java/org/example/domain/Contact.java @@ -3,6 +3,7 @@ package org.example.domain; import io.ebean.annotation.DbArray; import javax.persistence.*; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -11,33 +12,35 @@ import java.util.Map; * Contact entity bean. */ @Entity -@Table(name="be_contact") +@Table(name = "be_contact") public class Contact extends BaseModel { @DbArray - List phoneNumbers = new ArrayList(); + List phoneNumbers = new ArrayList<>(); - @Column(length=50) + @Column(length = 50) String firstName; - @Column(length=50) + @Column(length = 50) String lastName; - @Column(length=200) + @Column(length = 200) String email; - @Column(length=20) + @Column(length = 20) String phone; - @ManyToOne(optional=false) + ZonedDateTime zoneDateTime; + + @ManyToOne(optional = false) Customer customer; @OneToMany(mappedBy = "contact") List notes; @OneToMany(cascade = CascadeType.PERSIST) - @MapKey(name="key") - Map others; + @MapKey(name = "key") + Map others; /** * Default constructor. @@ -85,6 +88,14 @@ public class Contact extends BaseModel { this.phone = phone; } + public ZonedDateTime getZoneDateTime() { + return zoneDateTime; + } + + public void setZoneDateTime(ZonedDateTime zoneDateTime) { + this.zoneDateTime = zoneDateTime; + } + public Customer getCustomer() { return customer; } diff --git a/ebean-querybean/src/test/java/org/querytest/QContactTest.java b/ebean-querybean/src/test/java/org/querytest/QContactTest.java index ff37f789e..ef0d5a01b 100644 --- a/ebean-querybean/src/test/java/org/querytest/QContactTest.java +++ b/ebean-querybean/src/test/java/org/querytest/QContactTest.java @@ -3,13 +3,15 @@ package org.querytest; import org.example.domain.query.QContact; import org.junit.Test; +import java.time.ZonedDateTime; + public class QContactTest { @Test public void test_oneToManyMap() { - new QContact() .others.fetch() + .zoneDateTime.before(ZonedDateTime.now()) .findList(); } } diff --git a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java index f5676f060..6afc8a6e3 100644 --- a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java +++ b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java @@ -25,10 +25,9 @@ class PropertyTypeMap { */ private final PropertyType dbJsonType = new PropertyType("PJson"); - private Map map = new HashMap<>(); + private final Map map = new HashMap<>(); PropertyTypeMap() { - map.put("boolean", new PropertyType("PBoolean")); map.put("short", new PropertyType("PShort")); map.put("int", new PropertyType("PInteger")); @@ -57,7 +56,6 @@ class PropertyTypeMap { addType(Locale.class); addType(File.class); addType(InetAddress.class); - map.put(URI.class.getName(), new PropertyType("PUri")); map.put(URL.class.getName(), new PropertyType("PUrl")); map.put(UUID.class.getName(), new PropertyType("PUuid")); @@ -74,7 +72,6 @@ class PropertyTypeMap { } private void addJava8Types() { - try { Class.forName("java.time.Instant"); } catch (ClassNotFoundException e) { @@ -94,6 +91,7 @@ class PropertyTypeMap { addType(java.time.YearMonth.class); addType(java.time.ZoneId.class); addType(java.time.ZoneOffset.class); + addType(java.time.ZonedDateTime.class); } private void addJodaTypes() { diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java index b60a42cd7..fa35c72fa 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java @@ -25,10 +25,9 @@ class PropertyTypeMap { */ private final PropertyType dbJsonType = new PropertyType("PJson"); - private Map map = new HashMap<>(); + private final Map map = new HashMap<>(); PropertyTypeMap() { - map.put("boolean", new PropertyType("PBoolean")); map.put("short", new PropertyType("PShort")); map.put("int", new PropertyType("PInteger")); @@ -57,7 +56,6 @@ class PropertyTypeMap { map.put("java.lang.Class", new PropertyType("PClass")); addType(File.class); addType(InetAddress.class); - map.put(URI.class.getName(), new PropertyType("PUri")); map.put(URL.class.getName(), new PropertyType("PUrl")); map.put(UUID.class.getName(), new PropertyType("PUuid")); @@ -73,7 +71,6 @@ class PropertyTypeMap { } private void addJava8Types() { - try { Class.forName("java.time.Instant"); } catch (ClassNotFoundException e) { @@ -93,6 +90,7 @@ class PropertyTypeMap { addType(java.time.YearMonth.class); addType(java.time.ZoneId.class); addType(java.time.ZoneOffset.class); + addType(java.time.ZonedDateTime.class); } private void addJodaTypes() {