You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2011/06/09 22:28:08 UTC

svn commit: r1134064 - in /openjpa/branches/2.1.x: openjpa-kernel/src/main/java/org/apache/openjpa/conf/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/ openjpa-persiste...

Author: hthomann
Date: Thu Jun  9 20:28:07 2011
New Revision: 1134064

URL: http://svn.apache.org/viewvc?rev=1134064&view=rev
Log:
OPENJPA-1999: Optional support for non-sequential positional parameters - used Rick's provided patch for trunk.

Modified:
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/QueryMetaData.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/SimpleEntity.java
    openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
    openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
    openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
    openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java Thu Jun  9 20:28:07 2011
@@ -66,6 +66,7 @@ public class Compatibility {
     private boolean _isNonDefaultMappingAllowed = false;
     private boolean _reloadOnDetach = false;
     private boolean _ignoreDetachedStateFieldForProxySerialization = false;
+    private boolean _convertPositionalParametersToNamed = false;
     
     /**
      * Whether to require exact identity value types when creating object
@@ -327,6 +328,14 @@ public class Compatibility {
     public boolean getIgnoreDetachedStateFieldForProxySerialization() {
         return _ignoreDetachedStateFieldForProxySerialization;
     }
+    
+    public boolean getConvertPositionalParametersToNamed() {
+        return _convertPositionalParametersToNamed;
+    }
+
+    public void setConvertPositionalParametersToNamed(boolean c) {
+        _convertPositionalParametersToNamed = c;
+    }    
 
     /**
      * Whether OpenJPA should flush changes before detaching or serializing an

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java Thu Jun  9 20:28:07 2011
@@ -2038,7 +2038,8 @@ public class MetaDataRepository implemen
      * Create a new query metadata instance.
      */
     protected QueryMetaData newQueryMetaData(Class<?> cls, String name) {
-        QueryMetaData meta = new QueryMetaData(name);
+        QueryMetaData meta =
+            new QueryMetaData(name, _conf.getCompatibilityInstance().getConvertPositionalParametersToNamed());
         meta.setDefiningType(cls);
         return meta;
     }

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/QueryMetaData.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/QueryMetaData.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/QueryMetaData.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/QueryMetaData.java Thu Jun  9 20:28:07 2011
@@ -25,6 +25,8 @@ import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.openjpa.kernel.Query;
+import org.apache.openjpa.kernel.QueryLanguages;
+import org.apache.openjpa.kernel.jpql.JPQLParser;
 import org.apache.openjpa.lib.meta.SourceTracker;
 import org.apache.openjpa.lib.xml.Commentable;
 
@@ -58,12 +60,13 @@ public class QueryMetaData
     private String _resultSetMappingName;
     private int _lineNum;  
     private int _colNum;  
-
+    private boolean _convertPositionalParametersToNamed;
     /**
      * Construct with the given name.
      */
-    protected QueryMetaData(String name) {
+    protected QueryMetaData(String name, boolean convertPositionalParametersToNamed) {
         _name = name;
+        _convertPositionalParametersToNamed = convertPositionalParametersToNamed;
     }
 
     /**
@@ -154,6 +157,9 @@ public class QueryMetaData
      * The full query string, or null if none.
      */
     public void setQueryString(String query) {
+        if (query != null && _convertPositionalParametersToNamed && JPQLParser.LANG_JPQL.equals(_language)) {
+            query = query.replaceAll("[\\?]", "\\:_");
+        }
         _query = query;
     }
 

Modified: openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/SimpleEntity.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/SimpleEntity.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/SimpleEntity.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/SimpleEntity.java Thu Jun  9 20:28:07 2011
@@ -44,7 +44,9 @@ import javax.persistence.Table;
             query="select a from simple a where a.id=:id and a.name=:name"),
     @NamedQuery(name="FindOne",
             query="select s from simple s where s.name = ?1"),
-    @NamedQuery(name="FindAll", query="select s from simple s")
+    @NamedQuery(name="FindAll", query="select s from simple s"),
+    @NamedQuery(name="SelectWithPositionalParameterNonOneStart",
+        query="select a from simple a where a.id=?900 and a.name=?2")
 })
 
 @NamedNativeQueries( { 

Modified: openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java Thu Jun  9 20:28:07 2011
@@ -1815,8 +1815,8 @@ public class AnnotationPersistenceMetaDa
                 continue;
             }
             meta = getRepository().addQueryMetaData(_cls, query.name());
-            meta.setQueryString(query.query());
             meta.setLanguage(JPQLParser.LANG_JPQL);
+            meta.setQueryString(query.query());
             for (QueryHint hint : query.hints())
                 meta.addHint(hint.name(), hint.value());
             LockModeType lmt = processNamedQueryLockModeType(query);
@@ -1888,8 +1888,8 @@ public class AnnotationPersistenceMetaDa
             }
 
             meta = getRepository().addQueryMetaData(null, query.name());
-            meta.setQueryString(query.query());
             meta.setLanguage(QueryLanguages.LANG_SQL);
+            meta.setQueryString(query.query());
             Class<?> res = query.resultClass();
             if (ImplHelper.isManagedType(getConfiguration(), res))
                 meta.setCandidateType(res);

Modified: openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Thu Jun  9 20:28:07 2011
@@ -113,7 +113,8 @@ public class EntityManagerImpl
     private EntityManagerFactoryImpl _emf;
     private Map<FetchConfiguration,FetchPlan> _plans = new IdentityHashMap<FetchConfiguration,FetchPlan>(1);
     protected RuntimeExceptionTranslator _ret = PersistenceExceptions.getRollbackTranslator(this);
-
+    private boolean _convertPositionalParams = false;
+    
     public EntityManagerImpl() {
         // for Externalizable
     }
@@ -129,6 +130,9 @@ public class EntityManagerImpl
         _emf = factory;
         _broker = new DelegatingBroker(broker, _ret);
         _broker.setImplicitBehavior(this, _ret);
+        
+        _convertPositionalParams =
+            factory.getConfiguration().getCompatibilityInstance().getConvertPositionalParametersToNamed();
     }
 
     /**
@@ -977,6 +981,10 @@ public class EntityManagerImpl
     public OpenJPAQuery createQuery(String language, String query) {
         assertNotCloseInvoked();
         try {
+            // We need
+            if (query != null && _convertPositionalParams && JPQLParser.LANG_JPQL.equals(language)) {
+                query = query.replaceAll("[\\?]", "\\:_");
+            }
             String qid = query;
             PreparedQuery pq = JPQLParser.LANG_JPQL.equals(language)
                 ? getPreparedQuery(qid) : null;
@@ -1017,11 +1025,10 @@ public class EntityManagerImpl
                 _broker.getClassLoader(), true);
             String qid = meta.getQueryString();
             
-            PreparedQuery pq = JPQLParser.LANG_JPQL.equals(meta.getLanguage())
-                ? getPreparedQuery(qid) : null;
-            org.apache.openjpa.kernel.Query del = (pq == null || !pq.isInitialized())
-                ? _broker.newQuery(meta.getLanguage(), meta.getQueryString())
-                : _broker.newQuery(pq.getLanguage(), pq);
+            PreparedQuery pq = JPQLParser.LANG_JPQL.equals(meta.getLanguage()) ? getPreparedQuery(qid) : null;
+            org.apache.openjpa.kernel.Query del =
+                (pq == null || !pq.isInitialized()) ? _broker.newQuery(meta.getLanguage(), meta.getQueryString())
+                    : _broker.newQuery(pq.getLanguage(), pq);
             
             if (pq != null) {
                 pq.setInto(del);
@@ -1060,7 +1067,8 @@ public class EntityManagerImpl
     }
 
     protected <T> QueryImpl<T> newQueryImpl(org.apache.openjpa.kernel.Query kernelQuery) {
-        return new QueryImpl<T>(this, _ret, kernelQuery);
+        return new QueryImpl<T>(this, _ret, kernelQuery, _convertPositionalParams
+            && !kernelQuery.getLanguage().equals(QueryLanguages.LANG_SQL));
     }
 
     /**

Modified: openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java Thu Jun  9 20:28:07 2011
@@ -93,6 +93,7 @@ public class QueryImpl<X> implements Ope
     private transient ReentrantLock _lock = null;
 	private HintHandler _hintHandler;
 	private boolean _relaxBindParameterTypeChecking;
+	final private boolean _convertPositionalParams;
 	
 	/**
 	 * Constructor; supply factory exception translator and delegate.
@@ -101,19 +102,21 @@ public class QueryImpl<X> implements Ope
 	 * @param ret Exception translator for this query
 	 * @param query The underlying "kernel" query.
 	 */
-	public QueryImpl(EntityManagerImpl em, RuntimeExceptionTranslator ret, org.apache.openjpa.kernel.Query query) {
-		_em = em;
-		_query = new DelegatingQuery(query, ret);
-		_lock = new ReentrantLock();
-	}
+	public QueryImpl(EntityManagerImpl em, RuntimeExceptionTranslator ret, org.apache.openjpa.kernel.Query query,
+        boolean convertPositionalParams) {
+        _em = em;
+        _query = new DelegatingQuery(query, ret);
+        _lock = new ReentrantLock();
+        _convertPositionalParams = convertPositionalParams;
+    }
 
 	/**
 	 * Constructor; supply factory and delegate.
 	 * 
 	 * @deprecated
 	 */
-	public QueryImpl(EntityManagerImpl em, org.apache.openjpa.kernel.Query query) {
-		this(em, null, query);
+	public QueryImpl(EntityManagerImpl em, org.apache.openjpa.kernel.Query query, boolean convertPositionalParams) {
+		this(em, null, query, convertPositionalParams);
 	}
 
 	/**
@@ -677,6 +680,10 @@ public class QueryImpl<X> implements Ope
      * parameter of the query or if the argument is of incorrect type
      */    
     public OpenJPAQuery<X> setParameter(int pos, Object value) {
+        if (_convertPositionalParams == true) {
+            return setParameter("_"+String.valueOf(pos), value);
+        }
+        
         _query.assertOpen();
         _em.assertNotCloseInvoked();
         _query.lock();
@@ -868,6 +875,9 @@ public class QueryImpl<X> implements Ope
      * the same parameter position is bound already.
      */
     public <T> Parameter<T> getParameter(int pos, Class<T> type) {
+        if (_convertPositionalParams == true) {
+            return getParameter("_"+String.valueOf(pos), type);
+        }
         Parameter<?> param = getParameter(pos);
         if (param.getParameterType().isAssignableFrom(type))
             throw new IllegalArgumentException(param + " does not match the requested type " + type);
@@ -944,6 +954,9 @@ public class QueryImpl<X> implements Ope
      * @throws IllegalArgumentException if the parameter with the given position does not exist
      */
     public Parameter<?> getParameter(int pos) {
+        if(_convertPositionalParams == true){
+            return getParameter("_"+String.valueOf(pos));
+        }
         Parameter<?> param = getDeclaredParameters().get(pos);
         if (param == null)
             throw new IllegalArgumentException(_loc.get("param-missing-pos", 

Modified: openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=1134064&r1=1134063&r2=1134064&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Thu Jun  9 20:28:07 2011
@@ -1672,8 +1672,8 @@ public class XMLPersistenceMetaDataParse
 
         meta = getRepository().addQueryMetaData(null, name);
         meta.setDefiningType(_cls);
-        meta.setQueryString(attrs.getValue("query"));
         meta.setLanguage(JPQLParser.LANG_JPQL);
+        meta.setQueryString(attrs.getValue("query"));
         String lockModeStr = attrs.getValue("lock-mode");
         LockModeType lmt = processNamedQueryLockModeType(log, lockModeStr, name);
         if (lmt != null) {
@@ -1775,8 +1775,8 @@ public class XMLPersistenceMetaDataParse
 
         meta = getRepository().addQueryMetaData(null, name);
         meta.setDefiningType(_cls);
-        meta.setQueryString(attrs.getValue("query"));
         meta.setLanguage(QueryLanguages.LANG_SQL);
+        meta.setQueryString(attrs.getValue("query"));
         String val = attrs.getValue("result-class");
         if (val != null) {
             Class<?> type = classForName(val);