diff --git a/ebean-querybean/src/test/java/org/example/domain/AreaImpl.java b/ebean-querybean/src/test/java/org/example/domain/AreaImpl.java new file mode 100644 index 000000000..940f9eb83 --- /dev/null +++ b/ebean-querybean/src/test/java/org/example/domain/AreaImpl.java @@ -0,0 +1,35 @@ +package org.example.domain; + +import org.example.domain.target.ACity; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import java.util.List; + +@Entity +public class AreaImpl { + + @Id + long id; + + @OneToMany(targetEntity = CityImpl.class, cascade = CascadeType.ALL) + List cities; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public List getCities() { + return cities; + } + + public void setCities(List cities) { + this.cities = cities; + } +} diff --git a/ebean-querybean/src/test/java/org/example/domain/CityImpl.java b/ebean-querybean/src/test/java/org/example/domain/CityImpl.java new file mode 100644 index 000000000..b42949671 --- /dev/null +++ b/ebean-querybean/src/test/java/org/example/domain/CityImpl.java @@ -0,0 +1,36 @@ +package org.example.domain; + +import org.example.domain.target.ACity; +import org.example.domain.target.ACountry; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@Entity +public class CityImpl implements ACity { + + @Id + long id; + + String name; + + @ManyToOne(targetEntity = CountryImpl.class) + ACountry country; + + @Override + public long id() { + return id; + } + + @Override + public String name() { + return null; + } + + @Override + public ACountry country() { + return country; + } + +} diff --git a/ebean-querybean/src/test/java/org/example/domain/CountryImpl.java b/ebean-querybean/src/test/java/org/example/domain/CountryImpl.java new file mode 100644 index 000000000..ed8ac7759 --- /dev/null +++ b/ebean-querybean/src/test/java/org/example/domain/CountryImpl.java @@ -0,0 +1,18 @@ +package org.example.domain; + +import org.example.domain.target.ACountry; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class CountryImpl implements ACountry { + + @Id + String code; + + @Override + public String code() { + return code; + } +} diff --git a/ebean-querybean/src/test/java/org/querytest/TargetTest.java b/ebean-querybean/src/test/java/org/querytest/TargetTest.java new file mode 100644 index 000000000..8e83e5c05 --- /dev/null +++ b/ebean-querybean/src/test/java/org/querytest/TargetTest.java @@ -0,0 +1,24 @@ +package org.querytest; + +import org.example.domain.query.QAreaImpl; +import org.example.domain.query.QCityImpl; +import org.junit.Test; + +public class TargetTest { + + @Test + public void test_oneToMany() { + + new QAreaImpl() + .cities.fetch() + .findList(); + } + + @Test + public void test_manyToOne() { + + new QCityImpl() + .country.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 dc045bcf6..5580c3b09 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 @@ -303,12 +303,19 @@ class ProcessingContext implements Constants { return new PropertyTypeEnum(fullType, Split.shortName(fullType)); } + // look for targetEntity annotation attribute + final String targetEntity = readTargetEntity(field); + if (targetEntity != null) { + final TypeElement element = elementUtils.getTypeElement(targetEntity); + if (isEntityOrEmbedded(element)) { + return createPropertyTypeAssoc(typeDef(element.asType())); + } + } if (isEntityOrEmbedded(fieldType)) { // public QAssocContact contacts; return createPropertyTypeAssoc(typeDef(typeMirror)); } - PropertyType result = null; if (typeMirror.getKind() == TypeKind.DECLARED) { DeclaredType declaredType = (DeclaredType) typeMirror; List typeArguments = declaredType.getTypeArguments(); @@ -319,16 +326,7 @@ class ProcessingContext implements Constants { } Element argElement = typeUtils.asElement(argType); if (isEntityOrEmbedded(argElement)) { - result = createPropertyTypeAssoc(typeDef(argElement.asType())); - } else { - // look for targetEntity annotation attribute - final String targetEntity = readTargetEntity(field); - if (targetEntity != null) { - final TypeElement element = elementUtils.getTypeElement(targetEntity); - if (isEntityOrEmbedded(element)) { - result = createPropertyTypeAssoc(typeDef(element.asType())); - } - } + return createPropertyTypeAssoc(typeDef(argElement.asType())); } } else if (typeArguments.size() == 2) { TypeMirror argType = typeArguments.get(1); @@ -342,14 +340,10 @@ class ProcessingContext implements Constants { } } - if (result != null) { - return result; + if (typeInstanceOf(typeMirror, "java.lang.Comparable")) { + return new PropertyTypeScalarComparable(typeMirror.toString()); } else { - if (typeInstanceOf(typeMirror, "java.lang.Comparable")) { - return new PropertyTypeScalarComparable(typeMirror.toString()); - } else { - return new PropertyTypeScalar(typeMirror.toString()); - } + return new PropertyTypeScalar(typeMirror.toString()); } } 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 6e41747d0..6eae281b6 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 @@ -286,6 +286,15 @@ class ProcessingContext implements Constants { return new PropertyTypeEnum(fullType, Split.shortName(fullType)); } + // look for targetEntity annotation attribute + final String targetEntity = readTargetEntity(field); + if (targetEntity != null) { + final TypeElement element = elementUtils.getTypeElement(targetEntity); + if (isEntityOrEmbedded(element)) { + return createPropertyTypeAssoc(typeDef(element.asType())); + } + } + if (isEntityOrEmbedded(fieldType)) { // public QAssocContact contacts; return createPropertyTypeAssoc(typeDef(typeMirror)); @@ -331,15 +340,6 @@ class ProcessingContext implements Constants { Element argElement = typeUtils.asElement(typeArguments.get(0)); if (isEntityOrEmbedded(argElement)) { return createPropertyTypeAssoc(typeDef(argElement.asType())); - } else { - // look for targetEntity annotation attribute - final String targetEntity = readTargetEntity(field); - if (targetEntity != null) { - final TypeElement element = elementUtils.getTypeElement(targetEntity); - if (isEntityOrEmbedded(element)) { - return createPropertyTypeAssoc(typeDef(element.asType())); - } - } } } else if (typeArguments.size() == 2) { Element argElement = typeUtils.asElement(typeArguments.get(1));