diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java index 18e116d933..84920e513d 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java @@ -19,6 +19,8 @@ package org.apache.openjpa.persistence.criteria; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import javax.persistence.EntityManager; @@ -27,6 +29,7 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; +import javax.persistence.criteria.ParameterExpression; import org.apache.openjpa.persistence.OpenJPAEntityManager; import org.apache.openjpa.persistence.query.DomainObject; @@ -646,5 +649,25 @@ void setParameters(Query q, Object...p) { q.setParameter(p[i].toString(), p[i+1]); } } + + public void testInCriteriaWithCollection() { + + OpenJPAEntityManager em = emf.createEntityManager(); + CriteriaBuilder builder = em.getCriteriaBuilder(); + + CriteriaQuery criteria = builder.createQuery(Customer.class); + Root root = criteria.from(Customer.class); + criteria.where(root.get("status").in(builder.parameter(Collection.class))); + + TypedQuery query = em.createQuery(criteria); + System.err.println(query); + for (ParameterExpression parameter : criteria.getParameters()) { + query.setParameter(parameter, Arrays.asList(1L, 2L)); + } + + assertEquals("SELECT * FROM Customer c WHERE c.status IN (:param)", criteria.toString()); + query.getResultList(); + assertEquals("SELECT * FROM Customer c WHERE c.status IN (:param)", criteria.toString()); + } } diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java index d1ca11ded5..c22bb91a94 100644 --- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java +++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java @@ -1440,6 +1440,12 @@ public In(Expression e) { this.e = (ExpressionImpl)e; } + private Expressions.In copy() { + In in = new Expressions.In<>(this.e); + in._exps.addAll(this._exps); + return in; + } + @Override public Expression getExpression() { return e; @@ -1468,7 +1474,11 @@ public PredicateImpl not() { } @Override - org.apache.openjpa.kernel.exps.Expression toKernelExpression( + org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl q) { + return copy().toKernelExpression0(factory, q); + } + + org.apache.openjpa.kernel.exps.Expression toKernelExpression0( ExpressionFactory factory, CriteriaQueryImpl q) { org.apache.openjpa.kernel.exps.Expression inExpr = null; if (_exps.size() == 1) {