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 2006/04/30 00:29:19 UTC
svn commit: r398249 - in /incubator/cayenne/jpa/trunk:
cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/
cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/
cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/
Author: aadamchik
Date: Sat Apr 29 15:29:13 2006
New Revision: 398249
URL: http://svn.apache.org/viewcvs?rev=398249&view=rev
Log:
implemented SelectQuery with qualifier and parameters support
Modified:
incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaIndirectQuery.java
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSQLTemplate.java
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSelectQuery.java
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/QueryHints.java
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaDataSourceFactory.java
incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaQuery.java
Modified: incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java?rev=398249&r1=398248&r2=398249&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa-annotations-example/src/main/java/org/apache/cayenne/jpa/example/entity/Department.java Sat Apr 29 15:29:13 2006
@@ -25,7 +25,8 @@
@Entity
@NamedQuery(name = "DepartmentWithName", query = "delete from department", hints = {
- @QueryHint(name = QueryHints.QUERY_TYPE_HINT, value = QueryHints.SELECT_QUERY)
+ @QueryHint(name = QueryHints.QUERY_TYPE_HINT, value = QueryHints.SELECT_QUERY),
+ @QueryHint(name = QueryHints.QUALIFIER_HINT, value = "name likeIgnoreCase $name")
})
public class Department {
Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaIndirectQuery.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaIndirectQuery.java?rev=398249&r1=398248&r2=398249&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaIndirectQuery.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaIndirectQuery.java Sat Apr 29 15:29:13 2006
@@ -15,21 +15,45 @@
*/
package org.apache.cayenne.jpa.bridge;
+import java.util.Map;
+
+import org.apache.cayenne.jpa.JpaProviderException;
import org.apache.cayenne.jpa.map.JpaNamedQuery;
import org.objectstyle.cayenne.map.DataMap;
import org.objectstyle.cayenne.map.ObjEntity;
import org.objectstyle.cayenne.query.IndirectQuery;
+import org.objectstyle.cayenne.query.ParameterizedQuery;
+import org.objectstyle.cayenne.query.Query;
/**
* A superclass of indirect queries that map JPA to Cayenne queries.
*
* @author Andrus Adamchik
*/
-public abstract class JpaIndirectQuery extends IndirectQuery {
+public abstract class JpaIndirectQuery extends IndirectQuery implements
+ ParameterizedQuery {
protected JpaNamedQuery jpaQuery;
protected DataMap parentMap;
protected ObjEntity parentEntity;
+ protected Map parameters;
+
+ public Query createQuery(Map parameters) {
+ JpaIndirectQuery clone;
+ try {
+ clone = (JpaIndirectQuery) getClass().newInstance();
+ }
+ catch (Exception e) {
+ throw new JpaProviderException("Error cloning a query", e);
+ }
+
+ clone.setJpaQuery(jpaQuery);
+ clone.setParentEntity(parentEntity);
+ clone.setParentMap(parentMap);
+ clone.parameters = parameters;
+
+ return clone;
+ }
public JpaNamedQuery getJpaQuery() {
return jpaQuery;
Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSQLTemplate.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSQLTemplate.java?rev=398249&r1=398248&r2=398249&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSQLTemplate.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSQLTemplate.java Sat Apr 29 15:29:13 2006
@@ -15,6 +15,8 @@
*/
package org.apache.cayenne.jpa.bridge;
+import java.util.Collections;
+
import org.objectstyle.cayenne.CayenneRuntimeException;
import org.objectstyle.cayenne.map.EntityResolver;
import org.objectstyle.cayenne.query.Query;
@@ -46,6 +48,9 @@
throw new CayenneRuntimeException("Unknown query root. Name: " + getName());
}
- return query;
+ return query.queryWithParameters(parameters != null
+ ? parameters
+ : Collections.EMPTY_MAP);
}
+
}
Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSelectQuery.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSelectQuery.java?rev=398249&r1=398248&r2=398249&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSelectQuery.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/JpaSelectQuery.java Sat Apr 29 15:29:13 2006
@@ -15,8 +15,14 @@
*/
package org.apache.cayenne.jpa.bridge;
+import java.util.Collections;
+
+import org.apache.cayenne.jpa.map.JpaQueryHint;
+import org.objectstyle.cayenne.CayenneRuntimeException;
+import org.objectstyle.cayenne.exp.Expression;
import org.objectstyle.cayenne.map.EntityResolver;
import org.objectstyle.cayenne.query.Query;
+import org.objectstyle.cayenne.query.SelectQuery;
/**
* An indirect query that resolves to Cayenne SelectQuery using information from JPA query
@@ -26,8 +32,28 @@
*/
public class JpaSelectQuery extends JpaIndirectQuery {
+ /**
+ * Creates a SelectQuery using query hints.
+ */
@Override
protected Query createReplacementQuery(EntityResolver resolver) {
- throw new UnsupportedOperationException("TODO");
+ SelectQuery query = new SelectQuery();
+
+ if (parentEntity != null) {
+ query.setRoot(parentEntity);
+ }
+ else {
+ throw new CayenneRuntimeException("No parent entity. Query name: "
+ + getName());
+ }
+
+ JpaQueryHint qualifierHint = jpaQuery.getHint(QueryHints.QUALIFIER_HINT);
+ if (qualifierHint != null) {
+ query.setQualifier(Expression.fromString(qualifierHint.getValue()));
+ }
+
+ return query.queryWithParameters(parameters != null
+ ? parameters
+ : Collections.EMPTY_MAP);
}
}
Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/QueryHints.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/QueryHints.java?rev=398249&r1=398248&r2=398249&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/QueryHints.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/QueryHints.java Sat Apr 29 15:29:13 2006
@@ -15,7 +15,6 @@
*/
package org.apache.cayenne.jpa.bridge;
-
public interface QueryHints {
public static final String QUERY_TYPE_HINT = "cayenne.query.type";
@@ -26,4 +25,6 @@
public static final String SELECT_QUERY = "org.apache.cayenne.jpa.bridge.JpaSelectQuery";
public static final String PROCEDURE_QUERY = "org.apache.cayenne.jpa.bridge.JpaProcedureQuery";
public static final String SQL_TEMPLATE_QUERY = "org.apache.cayenne.jpa.bridge.JpaSQLTemplate";
+
+ public static final String QUALIFIER_HINT = "cayenne.query.qualifier";
}
Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaDataSourceFactory.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaDataSourceFactory.java?rev=398249&r1=398248&r2=398249&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaDataSourceFactory.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaDataSourceFactory.java Sat Apr 29 15:29:13 2006
@@ -62,8 +62,8 @@
public class CjpaDataSourceFactory extends JndiJpaDataSourceFactory {
public static final String DATA_SOURCE_PREFIX = "CayenneDataSource.";
- public static final String MIN_CONNECTIONS_SUFFIX = "minConnections";
- public static final String MAX_CONNECTIONS_SUFFIX = "maxConnections";
+ public static final String MIN_CONNECTIONS_SUFFIX = "jdbc.minConnections";
+ public static final String MAX_CONNECTIONS_SUFFIX = "jdbc.maxConnections";
static String getPropertyName(String dataSourceName, String suffix) {
return DATA_SOURCE_PREFIX + dataSourceName + "." + suffix;
Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaQuery.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaQuery.java?rev=398249&r1=398248&r2=398249&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaQuery.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaQuery.java Sat Apr 29 15:29:13 2006
@@ -39,13 +39,11 @@
public class CjpaQuery implements Query {
protected Map<String, Object> parameters = new HashMap<String, Object>();
-
- protected org.objectstyle.cayenne.query.Query cquery;
-
- protected DataContext ctxt;
+ protected org.objectstyle.cayenne.query.Query cayenneQuery;
+ protected DataContext context;
public CjpaQuery(DataContext ctxt) {
- this.ctxt = ctxt;
+ this.context = ctxt;
}
/**
@@ -54,10 +52,11 @@
* @param ctxt
* @param name
*/
- public CjpaQuery(DataContext ctxt, String name) {
- this(ctxt);
+ public CjpaQuery(DataContext context, String name) {
+ this(context);
- org.objectstyle.cayenne.query.Query q = ctxt.getEntityResolver().lookupQuery(name);
+ org.objectstyle.cayenne.query.Query q = context.getEntityResolver().lookupQuery(
+ name);
if (q == null) {
throw new IllegalArgumentException("Non-existing query: " + name);
@@ -67,11 +66,11 @@
}
protected void setQuery(org.objectstyle.cayenne.query.Query q) {
- this.cquery = q;
+ this.cayenneQuery = q;
}
protected org.objectstyle.cayenne.query.Query getQuery() {
- return cquery;
+ return cayenneQuery;
}
/**
@@ -79,35 +78,32 @@
*/
private org.objectstyle.cayenne.query.Query queryWithParameters() {
if (parameters.size() == 0) {
- return cquery;
+ return cayenneQuery;
}
- return ((ParameterizedQuery) cquery).createQuery(parameters);
+ return ((ParameterizedQuery) cayenneQuery).createQuery(parameters);
}
/**
* Execute a SELECT query and return the query results as a List.
*
* @return a list of the results
- * @throws IllegalStateException
- * if called for an EJB QL UPDATE or DELETE statement
+ * @throws IllegalStateException if called for an EJB QL UPDATE or DELETE statement
*/
public List getResultList() {
- return ctxt.performQuery(queryWithParameters());
+ return context.performQuery(queryWithParameters());
}
/**
* Execute an update or delete statement.
*
* @return the number of entities updated or deleted
- * @throws IllegalStateException
- * if called for an EJB QL SELECT statement
- * @throws TransactionRequiredException
- * if there is no transaction
+ * @throws IllegalStateException if called for an EJB QL SELECT statement
+ * @throws TransactionRequiredException if there is no transaction
*/
public int executeUpdate() {
// TODO: check transaction
- int[] res = ctxt.performNonSelectingQuery(queryWithParameters());
+ int[] res = context.performNonSelectingQuery(queryWithParameters());
int num = 0;
for (int i = 0; i < res.length; i++) {
num = num + res[i];
@@ -119,12 +115,9 @@
* Execute a SELECT query that returns a single result.
*
* @return the result
- * @throws NoResultException
- * if there is no result
- * @throws NonUniqueResultException
- * if more than one result
- * @throws IllegalStateException
- * if called for an EJB QL UPDATE or DELETE statement
+ * @throws NoResultException if there is no result
+ * @throws NonUniqueResultException if more than one result
+ * @throws IllegalStateException if called for an EJB QL UPDATE or DELETE statement
*/
public Object getSingleResult() {
List rows = getResultList();
@@ -143,8 +136,7 @@
*
* @param maxResult
* @return the same query instance
- * @throws IllegalArgumentException
- * if argument is negative
+ * @throws IllegalArgumentException if argument is negative
*/
public Query setMaxResults(int maxResult) {
if (maxResult < 0) {
@@ -154,9 +146,11 @@
// TODO: use QueryMetadata?
if (getQuery() instanceof SelectQuery) {
((SelectQuery) getQuery()).setFetchLimit(maxResult);
- } else if (getQuery() instanceof SQLTemplate) {
+ }
+ else if (getQuery() instanceof SQLTemplate) {
((SQLTemplate) getQuery()).setFetchLimit(maxResult);
- } else if (getQuery() instanceof ProcedureQuery) {
+ }
+ else if (getQuery() instanceof ProcedureQuery) {
((ProcedureQuery) getQuery()).setFetchLimit(maxResult);
}
@@ -164,14 +158,14 @@
}
/**
- * Set an implementation-specific hint. If the hint name is not recognized,
- * it is silently ignored.
+ * Set an implementation-specific hint. If the hint name is not recognized, it is
+ * silently ignored.
*
* @param hintName
* @param value
* @return the same query instance
- * @throws IllegalArgumentException
- * if the second argument is not valid for the implementation
+ * @throws IllegalArgumentException if the second argument is not valid for the
+ * implementation
*/
public Query setHint(String hintName, Object value) {
return this;
@@ -180,15 +174,14 @@
/**
* Set the position of the first result to retrieve.
*
- * @param start
- * position of the first result, numbered from 0
+ * @param start position of the first result, numbered from 0
* @return the same query instance
- * @throws IllegalArgumentException
- * if argument is negative
+ * @throws IllegalArgumentException if argument is negative
*/
public Query setFirstResult(int startPosition) {
if (startPosition < 0) {
- throw new IllegalArgumentException("Invalid first result value: " + startPosition);
+ throw new IllegalArgumentException("Invalid first result value: "
+ + startPosition);
}
// TODO: support in core like fetchLimit?
// TODO: hack a temp solution here based on sub-list?
@@ -198,16 +191,14 @@
/**
* Bind an argument to a named parameter.
*
- * @param name
- * the parameter name
+ * @param name the parameter name
* @param value
* @return the same query instance
- * @throws IllegalArgumentException
- * if parameter name does not correspond to parameter in query
- * string or argument is of incorrect type
+ * @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 (!(cquery instanceof ParameterizedQuery)) {
+ if (!(cayenneQuery instanceof ParameterizedQuery)) {
throw new IllegalArgumentException("query does not accept parameters");
}
@@ -225,9 +216,8 @@
* @param value
* @param temporalType
* @return the same query instance
- * @throws IllegalArgumentException
- * if parameter name does not correspond to parameter in query
- * string
+ * @throws IllegalArgumentException if parameter name does not correspond to parameter
+ * in query string
*/
public Query setParameter(String name, Date value, TemporalType temporalType) {
// handled by cayenne.
@@ -241,9 +231,8 @@
* @param value
* @param temporalType
* @return the same query instance
- * @throws IllegalArgumentException
- * if parameter name does not correspond to parameter in query
- * string
+ * @throws IllegalArgumentException if parameter name does not correspond to parameter
+ * in query string
*/
public Query setParameter(String name, Calendar value, TemporalType temporalType) {
// handled by cayenne.
@@ -256,9 +245,8 @@
* @param position
* @param value
* @return the same query instance
- * @throws IllegalArgumentException
- * if position does not correspond to positional parameter of
- * query or argument is of incorrect type
+ * @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
@@ -272,9 +260,8 @@
* @param value
* @param temporalType
* @return the same query instance
- * @throws IllegalArgumentException
- * if position does not correspond to positional parameter of
- * query
+ * @throws IllegalArgumentException if position does not correspond to positional
+ * parameter of query
*/
public Query setParameter(int position, Date value, TemporalType temporalType) {
// handled by cayenne.
@@ -288,9 +275,8 @@
* @param value
* @param temporalType
* @return the same query instance
- * @throws IllegalArgumentException
- * if position does not correspond to positional parameter of
- * query
+ * @throws IllegalArgumentException if position does not correspond to positional
+ * parameter of query
*/
public Query setParameter(int position, Calendar value, TemporalType temporalType) {
// handled by cayenne.