From e00713aa2962ad79e9d0a51448ea0e5564d442f0 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Fri, 10 Jan 2020 01:03:38 +0100 Subject: [PATCH] Testcase for #1902 --- .../org/tests/model/basic/VwCustomer.java | 228 ++++++++++++++++++ .../query/other/TestQuerySingleAttribute.java | 15 ++ 2 files changed, 243 insertions(+) create mode 100644 src/test/java/org/tests/model/basic/VwCustomer.java diff --git a/src/test/java/org/tests/model/basic/VwCustomer.java b/src/test/java/org/tests/model/basic/VwCustomer.java new file mode 100644 index 000000000..ba5130156 --- /dev/null +++ b/src/test/java/org/tests/model/basic/VwCustomer.java @@ -0,0 +1,228 @@ +package org.tests.model.basic; + +import io.ebean.annotation.Cache; +import io.ebean.annotation.ChangeLog; +import io.ebean.annotation.ChangeLogInsertMode; +import io.ebean.annotation.DbComment; +import io.ebean.annotation.DbEnumValue; +import io.ebean.annotation.DocEmbedded; +import io.ebean.annotation.DocStore; +import io.ebean.annotation.JsonIgnore; +import io.ebean.annotation.View; +import io.ebean.annotation.Where; +import org.tests.model.basic.finder.CustomerFinder; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.sql.Date; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Customer entity bean. + */ +@NamedQueries( + value = { + @NamedQuery(name = "name", query = "select(name) order by name"), + @NamedQuery(name = "withStatus", query = "select(name,status) order by name") + } +) +@NamedQuery(name = "withContacts", query = "fetch contacts (firstName, lastName) where id = :id") +@Cache(enableQueryCache = true) +@DocStore +@ChangeLog(inserts = ChangeLogInsertMode.EXCLUDE, updatesThatInclude = {"name", "status"}) +@Entity +@View(name = "o_customer", // treat table like a view... + dependentTables = "o_customer") +@DbComment("Holds external customers") +public class VwCustomer extends BasicDomain { + + private static final long serialVersionUID = 1L; + + public static final CustomerFinder find = new CustomerFinder(); + + /** + * EnumValue is an Ebean specific mapping for enums. + */ + public enum Status { + NEW("N"), + ACTIVE("A"), + INACTIVE("I"); + + String dbValue; + + Status(String dbValue) { + this.dbValue = dbValue; + } + + @DbEnumValue + public String getValue() { + return dbValue; + } + } + + @Transient + Boolean selected; + + + @JsonIgnore + //@Expose(deserialize = false, serialize = false) + @Transient + ReentrantLock lock = new ReentrantLock(); + + @DbComment("status of the customer") + Status status; + + @NotNull + @Size(max = 40) + String name; + + @DbComment("Short notes regarding the customer") + @Size(max = 100) + String smallnote; + + @DbComment("Join date of the customer") + @NotNull(groups = {ValidationGroupSomething.class}) + Date anniversary; + + @DocEmbedded(doc = "*,country(*)") + @ManyToOne(cascade = CascadeType.ALL) + Address billingAddress; + + @DocEmbedded(doc = "*,country(*)") + @ManyToOne(cascade = CascadeType.ALL) + Address shippingAddress; + + @OneToMany(mappedBy = "customer") + @Where(clause = "${ta}.order_date is not null") + List orders; + + @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL) + List contacts; + + @Override + public String toString() { + return id + " " + status + " " + name; + } + + /** + * Return name. + */ + public String getName() { + return name; + } + + /** + * Set name. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Return billing address. + */ + public Address getBillingAddress() { + return billingAddress; + } + + /** + * Set billing address. + */ + public void setBillingAddress(Address billingAddress) { + this.billingAddress = billingAddress; + } + + /** + * Return status. + */ + public Status getStatus() { + return status; + } + + /** + * Set status. + */ + public void setStatus(Status status) { + this.status = status; + } + + /** + * Return shipping address. + */ + public Address getShippingAddress() { + return shippingAddress; + } + + /** + * Set shipping address. + */ + public void setShippingAddress(Address shippingAddress) { + this.shippingAddress = shippingAddress; + } + + /** + * Return orders. + */ + public List getOrders() { + return orders; + } + + /** + * Set orders. + */ + public void setOrders(List orders) { + this.orders = orders; + } + + public Boolean getSelected() { + return selected; + } + + public void setSelected(Boolean selected) { + this.selected = selected; + } + + public ReentrantLock getLock() { + return lock; + } + + public String getSmallnote() { + return smallnote; + } + + public void setSmallnote(String smallnote) { + this.smallnote = smallnote; + } + + public Date getAnniversary() { + return anniversary; + } + + public void setAnniversary(Date anniversary) { + this.anniversary = anniversary; + } + + public List getContacts() { + return contacts; + } + + public void setContacts(List contacts) { + this.contacts = contacts; + } + + public void addContact(Contact contact) { + if (contacts == null) { + contacts = new ArrayList<>(); + } + contacts.add(contact); + } +} diff --git a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java index adfd3ff89..326c68398 100644 --- a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java +++ b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java @@ -14,6 +14,7 @@ import org.tests.model.basic.Contact; import org.tests.model.basic.Customer; import org.tests.model.basic.Order; import org.tests.model.basic.ResetBasicData; +import org.tests.model.basic.VwCustomer; import java.sql.Date; import java.time.LocalDate; @@ -288,6 +289,20 @@ public class TestQuerySingleAttribute extends BaseTestCase { assertThat(sqlOf(query)).contains("select t1.city from o_customer t0 left join o_address t1 on t1.id = t0.billing_address_id"); } + @Test + public void findSingleWithFetchOnView() { + + ResetBasicData.reset(); + + Query query = Ebean.find(VwCustomer.class) + .fetch("billingAddress", "city"); + + List cities = query.findSingleAttributeList(); + + assertThat(sqlOf(query)).contains("select t1.city from o_customer t0 left join o_address t1 on t1.id = t0.billing_address_id"); + assertThat(cities).contains("Auckland").containsNull(); + } + @Test public void findSingleSelectOnInheritedBean() {