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();