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")