Author: fancy
Date: Mon Oct 18 17:30:48 2010
New Revision: 1023914

URL: http://svn.apache.org/viewvc?rev=1023914&view=rev
Log:
OPENJPA-1828: Query with expression IN (collection_valued_input_parameter) 
gives wrong result when executed the second time

Modified:
    
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
    
openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java

Modified: 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java?rev=1023914&r1=1023913&r2=1023914&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
 (original)
+++ 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Param.java
 Mon Oct 18 17:30:48 2010
@@ -27,6 +27,7 @@ import org.apache.openjpa.jdbc.sql.SQLBu
 import org.apache.openjpa.jdbc.sql.Select;
 import org.apache.openjpa.kernel.Filters;
 import org.apache.openjpa.kernel.exps.Parameter;
+import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.util.ImplHelper;
 
 /**
@@ -38,6 +39,7 @@ public class Param
     extends Const
     implements Parameter {
 
+    private static final Localizer _loc = Localizer.forPackage(Param.class);
     private final Object _key;
     private Class _type = null;
     private int _idx = -1;
@@ -136,6 +138,10 @@ public class Param
             pstate.sqlValue = mapping.toDataStoreValue(val,
                 mapping.getPrimaryKeyColumns(), ctx.store);
             pstate.otherLength = mapping.getPrimaryKeyColumns().length;
+        } else if (val instanceof Collection) {
+            throw new IllegalArgumentException(_loc.get(
+                "collection-param-not-allowed", _key).toString());
+            
         } else
             pstate.sqlValue = val;
     }

Modified: 
openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties?rev=1023914&r1=1023913&r2=1023914&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties
 (original)
+++ 
openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/exps/localizer.properties
 Mon Oct 18 17:30:48 2010
@@ -50,3 +50,7 @@ type-in-expression-unsupported: The argu
 collection-param-unsupported: The collection parameter used in IN expression 
is not supported \
     for table-per-class inheritance hierarchy or inheritance type joined 
strategy. \
     Use TYPE equal comparison(s) and combine them with OR operators for 
polymorphic query results.
+collection-param-not-allowed: Invalid input parameter "{0}". \
+    A collection valued parameter syntax may incorrectly used in the query 
string. \
+    If the parameter is parenthesized, remove the parentheses and try again.
+    
\ No newline at end of file

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java?rev=1023914&r1=1023913&r2=1023914&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
 Mon Oct 18 17:30:48 2010
@@ -607,7 +607,7 @@ public class TestTypesafeCriteria extend
     }
     
     public void testParameters5() {
-        String jpql = "SELECT c FROM Customer c Where c.status IN (:coll)";
+        String jpql = "SELECT c FROM Customer c Where c.status IN :coll";
         
         CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
         Root<Customer> c = q.from(Customer.class);

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java?rev=1023914&r1=1023913&r2=1023914&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
 Mon Oct 18 17:30:48 2010
@@ -228,6 +228,38 @@ public class TestPreparedQueryCache exte
                em.close();
                super.tearDown();
        }
+    
+    public void testCollectionValuedParams() {
+        OpenJPAEntityManager em = emf.createEntityManager();
+        String jpql = "select c.name from Department c where c.name in 
(:names) order by c.name";
+        List<String> params = new ArrayList<String>();
+        for (int i = 0; i < DEPARTMENT_NAMES.length; i++)
+            params.add(DEPARTMENT_NAMES[i]);
+
+        List<String> rs = null;
+        List<String> rs2 = null;
+        try {
+            rs = (List<String>) em.createQuery(jpql).setParameter("names", 
params).getResultList();
+        } catch (Exception e) {
+            // as expected - syntax for collection valued parameter should be 
:names;
+        }
+        assertNull(rs);
+
+        try {
+            rs2 = (List<String>) em.createQuery(jpql).setParameter("names", 
params).getResultList();
+        } catch (Exception e) {
+            // as expected - syntax for collection valued parameter should be 
:names;
+        }
+        assertNull(rs2);
+
+        String jpql2 = "select c.name from Company c where c.name in :names 
order by c.name";
+        List<String> params2 = new ArrayList<String>();
+        for (int i = 0; i < COMPANY_NAMES.length; i++)
+            params2.add(COMPANY_NAMES[i]);
+        rs = (List<String>) em.createQuery(jpql2).setParameter("names", 
params2).getResultList();
+        rs2 = (List<String>) em.createQuery(jpql2).setParameter("names", 
params2).getResultList();
+        assertEquals(rs.size(), rs2.size());
+    }
 
     public void testCollectionValuedParameterOfEntities() {
         OpenJPAEntityManager em = emf.createEntityManager();


Reply via email to