diff --git a/ebean-querybean/src/test/java/org/example/domain/BaseModel.java b/ebean-querybean/src/test/java/org/example/domain/BaseModel.java index 593aa1ce4..211d3141c 100644 --- a/ebean-querybean/src/test/java/org/example/domain/BaseModel.java +++ b/ebean-querybean/src/test/java/org/example/domain/BaseModel.java @@ -1,8 +1,8 @@ package org.example.domain; import io.ebean.Model; -import io.ebean.annotation.CreatedTimestamp; -import io.ebean.annotation.UpdatedTimestamp; +import io.ebean.annotation.WhenCreated; +import io.ebean.annotation.WhenModified; import javax.persistence.Id; import javax.persistence.MappedSuperclass; @@ -11,10 +11,10 @@ import java.sql.Timestamp; /** * Base domain object with Id, version, whenCreated and whenUpdated. - * + * *

* Extending Model to enable the 'active record' style. - * + * *

* whenCreated and whenUpdated are generally useful for maintaining external search services (like * elasticsearch) and audit. @@ -28,10 +28,10 @@ public abstract class BaseModel extends Model { @Version Long version; - @CreatedTimestamp + @WhenCreated Timestamp whenCreated; - @UpdatedTimestamp + @WhenModified Timestamp whenUpdated; public Long getId() { 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 e47f66248..00035d80a 100644 --- a/ebean-querybean/src/test/java/org/example/domain/Contact.java +++ b/ebean-querybean/src/test/java/org/example/domain/Contact.java @@ -2,13 +2,10 @@ package org.example.domain; import io.ebean.annotation.DbArray; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import javax.persistence.*; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * Contact entity bean. @@ -22,28 +19,32 @@ public class Contact extends BaseModel { @Column(length=50) String firstName; - + @Column(length=50) String lastName; - + @Column(length=200) String email; @Column(length=20) String phone; - + @ManyToOne(optional=false) Customer customer; @OneToMany(mappedBy = "contact") List notes; + @OneToMany(cascade = CascadeType.PERSIST) + @MapKey(name="key") + Map others; + /** * Default constructor. */ public Contact() { } - + /** * Construct with a firstName and lastName. */ @@ -51,7 +52,7 @@ public class Contact extends BaseModel { this.firstName = firstName; this.lastName = lastName; } - + public String getFirstName() { return firstName; } diff --git a/ebean-querybean/src/test/java/org/example/domain/ContactOther.java b/ebean-querybean/src/test/java/org/example/domain/ContactOther.java new file mode 100644 index 000000000..731def6d6 --- /dev/null +++ b/ebean-querybean/src/test/java/org/example/domain/ContactOther.java @@ -0,0 +1,32 @@ +package org.example.domain; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * Contact entity bean. + */ +@Entity +@Table(name="be_contact_other") +public class ContactOther extends BaseModel { + + String key; + + int something; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public int getSomething() { + return something; + } + + public void setSomething(int something) { + this.something = something; + } +} diff --git a/ebean-querybean/src/test/java/org/querytest/QContactTest.java b/ebean-querybean/src/test/java/org/querytest/QContactTest.java new file mode 100644 index 000000000..ff37f789e --- /dev/null +++ b/ebean-querybean/src/test/java/org/querytest/QContactTest.java @@ -0,0 +1,15 @@ +package org.querytest; + +import org.example.domain.query.QContact; +import org.junit.Test; + +public class QContactTest { + + @Test + public void test_oneToManyMap() { + + new QContact() + .others.fetch() + .findList(); + } +} diff --git a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java index 327f67746..dc045bcf6 100644 --- a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java +++ b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java @@ -330,6 +330,15 @@ class ProcessingContext implements Constants { } } } + } else if (typeArguments.size() == 2) { + TypeMirror argType = typeArguments.get(1); + if (argType.getKind() == TypeKind.WILDCARD) { + argType = ((WildcardType) argType).getExtendsBound(); + } + Element argElement = typeUtils.asElement(argType); + if (isEntityOrEmbedded(argElement)) { + return createPropertyTypeAssoc(typeDef(argElement.asType())); + } } } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java index faec817bf..6e41747d0 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java @@ -341,6 +341,11 @@ class ProcessingContext implements Constants { } } } + } else if (typeArguments.size() == 2) { + Element argElement = typeUtils.asElement(typeArguments.get(1)); + if (isEntityOrEmbedded(argElement)) { + return createPropertyTypeAssoc(typeDef(argElement.asType())); + } } return null; }