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 _plans = new IdentityHashMap(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 QueryImpl newQueryImpl(org.apache.openjpa.kernel.Query kernelQuery) { - return new QueryImpl(this, _ret, kernelQuery); + return new QueryImpl(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 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 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 implements Ope * parameter of the query or if the argument is of incorrect type */ public OpenJPAQuery 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 implements Ope * the same parameter position is bound already. */ public Parameter getParameter(int pos, Class 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 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);