From 55584f09d5aa06fe2037f06a23e50be5b1fc168c Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Fri, 15 Jul 2016 23:33:09 +1200 Subject: [PATCH] #778 - ENH: Add support for loading named queries from ebean.xml --- .../server/deploy/BeanDescriptorManager.java | 5 + .../server/deploy/parse/DeployBeanInfo.java | 7 ++ .../xmlmapping/model/ObjectFactory.java | 8 ++ .../xmlmapping/model/XmEntity.java | 33 +++++++ .../xmlmapping/model/XmNamedQuery.java | 92 +++++++++++++++++++ src/main/resources/ebean-1.0.xsd | 12 ++- .../com/avaje/ebean/EbeanServer_eqlTest.java | 14 +++ src/test/resources/ebean.xml | 10 ++ 8 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmNamedQuery.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java index 4cbaa718d..4f73dffe0 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -53,6 +53,7 @@ import com.avaje.ebeaninternal.xmlmapping.model.XmAliasMapping; import com.avaje.ebeaninternal.xmlmapping.model.XmColumnMapping; import com.avaje.ebeaninternal.xmlmapping.model.XmEbean; import com.avaje.ebeaninternal.xmlmapping.model.XmEntity; +import com.avaje.ebeaninternal.xmlmapping.model.XmNamedQuery; import com.avaje.ebeaninternal.xmlmapping.model.XmRawSql; import com.avaje.ebeanservice.docstore.api.DocStoreBeanAdapter; import com.avaje.ebeanservice.docstore.api.DocStoreFactory; @@ -395,6 +396,10 @@ public class BeanDescriptorManager implements BeanDescriptorMap { } info.addRawSql(sql.getName(), builder.create()); } + + for (XmNamedQuery namedQuery : entityDeploy.getNamedQuery()) { + info.addNamedQuery(namedQuery.getName(), namedQuery.getQuery().getValue()); + } } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployBeanInfo.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployBeanInfo.java index 532ddde2d..63ffc3801 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployBeanInfo.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployBeanInfo.java @@ -82,4 +82,11 @@ public class DeployBeanInfo { public void addRawSql(String name, RawSql rawSql) { descriptor.addRawSql(name, rawSql); } + + /** + * Add the named query. + */ + public void addNamedQuery(String name, String query) { + descriptor.addNamedQuery(name, query); + } } diff --git a/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/ObjectFactory.java b/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/ObjectFactory.java index 38151f817..9d13626d9 100644 --- a/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/ObjectFactory.java +++ b/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/ObjectFactory.java @@ -77,4 +77,12 @@ public class ObjectFactory { return new XmEntity(); } + /** + * Create an instance of {@link XmNamedQuery } + * + */ + public XmNamedQuery createNamedQuery() { + return new XmNamedQuery(); + } + } diff --git a/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmEntity.java b/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmEntity.java index c7779e48f..6d2a26f54 100644 --- a/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmEntity.java +++ b/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmEntity.java @@ -21,6 +21,7 @@ import javax.xml.bind.annotation.XmlType; * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> + * <element ref="{http://ebean-orm.github.io/xml/ns/ebean}named-query" maxOccurs="unbounded"/> * <element ref="{http://ebean-orm.github.io/xml/ns/ebean}raw-sql" maxOccurs="unbounded"/> * </sequence> * <attribute name="class" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /> @@ -33,16 +34,48 @@ import javax.xml.bind.annotation.XmlType; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { + "namedQuery", "rawSql" }) @XmlRootElement(name = "entity") public class XmEntity { + @XmlElement(name = "named-query", required = true) + protected List namedQuery; @XmlElement(name = "raw-sql", required = true) protected List rawSql; @XmlAttribute(name = "class", required = true) protected String clazz; + /** + * Gets the value of the namedQuery property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the namedQuery property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getNamedQuery().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link XmNamedQuery } + * + * + */ + public List getNamedQuery() { + if (namedQuery == null) { + namedQuery = new ArrayList(); + } + return this.namedQuery; + } + /** * Gets the value of the rawSql property. * diff --git a/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmNamedQuery.java b/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmNamedQuery.java new file mode 100644 index 000000000..b6ea79401 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/xmlmapping/model/XmNamedQuery.java @@ -0,0 +1,92 @@ + +package com.avaje.ebeaninternal.xmlmapping.model; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for anonymous complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType>
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element ref="{http://ebean-orm.github.io/xml/ns/ebean}query"/>
+ *       </sequence>
+ *       <attribute name="name" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "query" +}) +@XmlRootElement(name = "named-query") +public class XmNamedQuery { + + @XmlElement(required = true) + protected XmQuery query; + @XmlAttribute(name = "name", required = true) + protected String name; + + /** + * Gets the value of the query property. + * + * @return + * possible object is + * {@link XmQuery } + * + */ + public XmQuery getQuery() { + return query; + } + + /** + * Sets the value of the query property. + * + * @param value + * allowed object is + * {@link XmQuery } + * + */ + public void setQuery(XmQuery value) { + this.query = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/src/main/resources/ebean-1.0.xsd b/src/main/resources/ebean-1.0.xsd index 970e3c605..c830f851f 100644 --- a/src/main/resources/ebean-1.0.xsd +++ b/src/main/resources/ebean-1.0.xsd @@ -15,12 +15,22 @@ - + + + + + + + + + + + diff --git a/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java b/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java index 4361bb2a2..dc704d1c0 100644 --- a/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java +++ b/src/test/java/com/avaje/ebean/EbeanServer_eqlTest.java @@ -104,4 +104,18 @@ public class EbeanServer_eqlTest extends BaseTestCase { assertThat(query.getGeneratedSql()).contains("from o_customer t0 left outer join contact t1 on t1.customer_id = t0.id "); } + + @Test + public void namedQuery_fromXml() { + + ResetBasicData.reset(); + + Query query = server() + .createNamedQuery(Customer.class, "withContactsById") + .setParameter("id", 1); + + query.findUnique(); + + assertThat(query.getGeneratedSql()).contains("from o_customer t0 left outer join contact t1 on t1.customer_id = t0.id "); + } } \ No newline at end of file diff --git a/src/test/resources/ebean.xml b/src/test/resources/ebean.xml index 112933a7a..7232b943b 100644 --- a/src/test/resources/ebean.xml +++ b/src/test/resources/ebean.xml @@ -46,4 +46,14 @@ + + + + select (name, version) + fetch contacts (firstName, lastName, email) + where id = :id + + + +