You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/01/06 00:48:08 UTC

svn commit: r609237 - in /cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa: JpaEJBQLQuery.java JpaNamedQuery.java JpaNativeQuery.java JpaQuery.java ResourceLocalEntityManager.java

Author: aadamchik
Date: Sat Jan  5 15:48:06 2008
New Revision: 609237

URL: http://svn.apache.org/viewvc?rev=609237&view=rev
Log:
JPA: query implementation refactoring to better handle parameters

Added:
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaEJBQLQuery.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNamedQuery.java
Modified:
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNativeQuery.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaQuery.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/ResourceLocalEntityManager.java

Added: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaEJBQLQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaEJBQLQuery.java?rev=609237&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaEJBQLQuery.java (added)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaEJBQLQuery.java Sat Jan  5 15:48:06 2008
@@ -0,0 +1,57 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.jpa;
+
+import javax.persistence.Query;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.query.EJBQLQuery;
+
+/**
+ * A JPA wrapper for {@link EJBQLQuery}.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public class JpaEJBQLQuery extends JpaQuery {
+
+    protected EJBQLQuery query;
+
+    public JpaEJBQLQuery(ObjectContext ctxt, String ejbqlString) {
+        super(ctxt);
+        query = new EJBQLQuery(ejbqlString);
+    }
+
+    @Override
+    protected org.apache.cayenne.query.Query getQuery() {
+        return query;
+    }
+
+    @Override
+    public Query setParameter(int position, Object value) {
+        query.setParameter(position, value);
+        return this;
+    }
+
+    @Override
+    public Query setParameter(String name, Object value) {
+        query.setParameter(name, value);
+        return this;
+    }
+}

Added: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNamedQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNamedQuery.java?rev=609237&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNamedQuery.java (added)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNamedQuery.java Sat Jan  5 15:48:06 2008
@@ -0,0 +1,57 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.jpa;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.query.NamedQuery;
+import org.apache.cayenne.query.Query;
+
+public class JpaNamedQuery extends JpaQuery {
+
+    protected Map<String, Object> parameters;
+    protected String queryName;
+
+    public JpaNamedQuery(ObjectContext ctxt, String queryName) {
+        super(ctxt);
+        this.queryName = queryName;
+    }
+
+    @Override
+    protected Query getQuery() {
+        return new NamedQuery(queryName, parameters);
+    }
+
+    @Override
+    public javax.persistence.Query setParameter(String name, Object value) {
+        if (parameters == null) {
+            parameters = new HashMap<String, Object>();
+        }
+
+        parameters.put(name, value);
+        return this;
+    }
+
+    @Override
+    public javax.persistence.Query setParameter(int position, Object value) {
+        throw new UnsupportedOperationException("TODO");
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNativeQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNativeQuery.java?rev=609237&r1=609236&r2=609237&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNativeQuery.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaNativeQuery.java Sat Jan  5 15:48:06 2008
@@ -19,25 +19,37 @@
 
 package org.apache.cayenne.jpa;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.persistence.Query;
 
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.query.SQLTemplate;
 
+/**
+ * A JPA wrapper for Cayenne {@link SQLTemplate}.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
 public class JpaNativeQuery extends JpaQuery {
 
     private static final String POSITIONAL_PARAM_PREFIX = "positional_";
 
+    protected SQLTemplate query;
+    protected Map<String, Object> parameters;
+
     public JpaNativeQuery(ObjectContext context, String sqlString, Class<?> resultClass) {
         super(context);
-        setQuery(new SQLTemplate(resultClass, processSQLString(sqlString)));
+        query = new SQLTemplate(resultClass, processSQLString(sqlString));
     }
 
     public JpaNativeQuery(ObjectContext context, String sqlString, String dataMapName) {
         super(context);
         DataMap map = context.getEntityResolver().getDataMap(dataMapName);
-        setQuery(new SQLTemplate(map, processSQLString(sqlString)));
+        query = new SQLTemplate(map, processSQLString(sqlString));
     }
 
     protected String processSQLString(String sqlString) {
@@ -60,6 +72,26 @@
         return sqlString;
     }
 
+    @Override
+    protected org.apache.cayenne.query.Query getQuery() {
+        return query;
+    }
+
+    @Override
+    public Query setParameter(String name, Object value) {
+
+        if (parameters == null) {
+            parameters = new HashMap<String, Object>();
+        }
+
+        parameters.put(name, value);
+
+        // must call every time to re-init the query
+        query.setParameters(parameters);
+
+        return this;
+    }
+
     /**
      * Bind an argument to a positional parameter.
      * 
@@ -82,5 +114,4 @@
                     + position, e);
         }
     }
-
 }

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaQuery.java?rev=609237&r1=609236&r2=609237&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaQuery.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/JpaQuery.java Sat Jan  5 15:48:06 2008
@@ -20,9 +20,7 @@
 
 import java.util.Calendar;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import javax.persistence.FlushModeType;
 import javax.persistence.NoResultException;
@@ -34,7 +32,6 @@
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.QueryResponse;
 import org.apache.cayenne.query.EJBQLQuery;
-import org.apache.cayenne.query.ParameterizedQuery;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
@@ -42,49 +39,15 @@
 /**
  * A JPA Query that wraps a Cayenne Query.
  */
-public class JpaQuery implements Query {
+public abstract class JpaQuery implements Query {
 
-    protected Map<String, Object> parameters = new HashMap<String, Object>();
-    protected org.apache.cayenne.query.Query cayenneQuery;
     protected ObjectContext context;
 
     public JpaQuery(ObjectContext ctxt) {
         this.context = ctxt;
     }
 
-    /**
-     * Construct a named query.
-     */
-    public JpaQuery(ObjectContext context, String name) {
-        this(context);
-
-        org.apache.cayenne.query.Query q = context.getEntityResolver().lookupQuery(name);
-
-        if (q == null) {
-            throw new IllegalArgumentException("Non-existing query: " + name);
-        }
-
-        setQuery(q);
-    }
-
-    protected void setQuery(org.apache.cayenne.query.Query q) {
-        this.cayenneQuery = q;
-    }
-
-    protected org.apache.cayenne.query.Query getQuery() {
-        return cayenneQuery;
-    }
-
-    /**
-     * Return the same query with parameters set.
-     */
-    private org.apache.cayenne.query.Query queryWithParameters() {
-        if (parameters.size() == 0) {
-            return cayenneQuery;
-        }
-
-        return ((ParameterizedQuery) cayenneQuery).createQuery(parameters);
-    }
+    protected abstract org.apache.cayenne.query.Query getQuery();
 
     /**
      * Execute a SELECT query and return the query results as a List.
@@ -94,7 +57,7 @@
      */
     @SuppressWarnings("unchecked")
     public List getResultList() {
-        return context.performQuery(queryWithParameters());
+        return context.performQuery(getQuery());
     }
 
     /**
@@ -107,7 +70,7 @@
     public int executeUpdate() {
         // TODO: check transaction
 
-        QueryResponse response = context.performGenericQuery(queryWithParameters());
+        QueryResponse response = context.performGenericQuery(getQuery());
         int[] res = response.firstUpdateCount();
 
         if (res == null) {
@@ -172,7 +135,7 @@
             throw new IllegalArgumentException("query does not support maxResult: "
                     + query);
         }
-        
+
         return this;
     }
 
@@ -220,17 +183,7 @@
      * @throws IllegalArgumentException if parameter name does not correspond to parameter
      *             in query string or argument is of incorrect type
      */
-    public Query setParameter(String name, Object value) {
-        if (!(cayenneQuery instanceof ParameterizedQuery)) {
-            throw new IllegalArgumentException("query does not accept parameters");
-        }
-
-        // TODO: check for valid parameter. should probably be built in to
-        // all ParameterizedQuerys
-
-        parameters.put(name, value);
-        return this;
-    }
+    public abstract Query setParameter(String name, Object value);
 
     /**
      * Bind an instance of java.util.Date to a named parameter.
@@ -271,10 +224,7 @@
      * @throws IllegalArgumentException if position does not correspond to positional
      *             parameter of query or argument is of incorrect type
      */
-    public Query setParameter(int position, Object value) {
-        // TODO: implement
-        throw new UnsupportedOperationException("TODO");
-    }
+    public abstract Query setParameter(int position, Object value);
 
     /**
      * Bind an instance of java.util.Date to a positional parameter.
@@ -305,5 +255,4 @@
         // handled by cayenne.
         return setParameter(position, value);
     }
-
 }

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/ResourceLocalEntityManager.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/ResourceLocalEntityManager.java?rev=609237&r1=609236&r2=609237&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/ResourceLocalEntityManager.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/ResourceLocalEntityManager.java Sat Jan  5 15:48:06 2008
@@ -33,7 +33,6 @@
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
-import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.RefreshQuery;
 
 public class ResourceLocalEntityManager implements EntityManager, CayenneEntityManager {
@@ -267,10 +266,7 @@
      */
     public Query createQuery(String ejbqlString) {
         checkClosed();
-
-        JpaQuery query = new JpaQuery(context);
-        query.setQuery(new EJBQLQuery(ejbqlString));
-        return query;
+        return new JpaEJBQLQuery(context, ejbqlString);
     }
 
     /**
@@ -283,7 +279,7 @@
      */
     public Query createNamedQuery(String name) {
         checkClosed();
-        return new JpaQuery(context, name);
+        return new JpaNamedQuery(context, name);
     }
 
     @SuppressWarnings("unchecked")