You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2010/07/26 19:32:01 UTC
svn commit: r979375 - in /openjpa/branches/2.0.x:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
Author: mikedd
Date: Mon Jul 26 17:32:01 2010
New Revision: 979375
URL: http://svn.apache.org/viewvc?rev=979375&view=rev
Log:
OPENJPA-1719: Prepared SQL cache user parameter ordering problem with subqueries. Merged from Catalina's changes for trunk.
Modified:
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
Modified: openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java?rev=979375&r1=979374&r2=979375&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java (original)
+++ openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java Mon Jul 26 17:32:01 2010
@@ -166,13 +166,12 @@ public final class SQLBuffer
_userParams = new ArrayList();
_userParams.addAll(paramIndex, buf._userParams);
}
- if (buf._userIndex != null) {
+ if (buf._userIndex != null) {
if (_userIndex == null) {
_userIndex = new ArrayList();
- _userIndex.addAll(buf._userIndex);
- } else
- _userIndex.addAll(paramIndex*2, buf._userIndex);
- }
+ }
+ _userIndex.addAll(buf._userIndex);
+ }
if (buf._cols != null)
_cols.addAll(paramIndex, buf._cols);
else if (_cols != null)
Modified: openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java?rev=979375&r1=979374&r2=979375&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java (original)
+++ openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java Mon Jul 26 17:32:01 2010
@@ -47,7 +47,6 @@ import org.apache.openjpa.persistence.Op
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.OpenJPAQuery;
import org.apache.openjpa.persistence.jdbc.sqlcache.Employee.Category;
-import org.apache.openjpa.persistence.test.AllowFailure;
/**
* Tests correctness and performance of queries with and without Prepared Query Cacheing.
@@ -756,8 +755,7 @@ public class TestPreparedQueryCache exte
assertFalse(book2.getAuthors().isEmpty());
}
- @AllowFailure(message="We have problems with reparametrization of subquery + constant literals")
- public void xtestQueryWithUserDefinedAndInternalParamtersInSubquery() {
+ public void testQueryWithUserDefinedAndInternalParamtersInSubquery() {
String jpql = "Select a From Address a Where Not Exists ("
+ " Select s.id From Singer As s Where "
+ " s.address = a And "
@@ -887,6 +885,34 @@ public class TestPreparedQueryCache exte
assertFalse(q2.getResultList().isEmpty());
}
+ public void testSubqueryParameters() {
+ EntityManager em = emf.createEntityManager();
+ String query = "select e from Employee e "
+ + "inner join e.department d "
+ + "inner join d.company c "
+ + "where mod(c.startYear, 100) = 0 "
+ + "and exists (select e2 from Employee e2 "
+ + "inner join e2.department d2 "
+ + "inner join d2.company c2 "
+ + "where e2.address.city = e.address.city "
+ + "and e2.isManager = false "
+ + "and d2.name = d.name "
+ + "and c2.name = :companyName) "
+ + "and d.name = :departmentName";
+
+ em.getTransaction().begin();
+ TypedQuery<Employee> q1 = em.createQuery(query, Employee.class);
+ q1.setParameter("companyName", "acme.org");
+ q1.setParameter("departmentName", "Engineering");
+ assertEquals(q1.getResultList().size(), 6);
+
+ TypedQuery<Employee> q2 = em.createQuery(query, Employee.class);
+ q2.setParameter("companyName", "acme.org");
+ q2.setParameter("departmentName", "Engineering");
+ assertEquals(q2.getResultList().size(), 6);
+ em.getTransaction().rollback();
+ }
+
public void testRepeatedParameterInSubqueryInDifferentOrder() {
OpenJPAEntityManager em = emf.createEntityManager();
String jpql = "select o from OrderJPA o "