[
https://issues.apache.org/jira/browse/OPENJPA-2018?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13924055#comment-13924055
]
Oliver Gierke commented on OPENJPA-2018:
----------------------------------------
This still seems to be broken for in 2.3.0 in case you refer to the parameter
by name. This works:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
Root<User> root = criteriaQuery.from(User.class);
ParameterExpression<Collection> parameter = builder.parameter(Collection.class);
criteriaQuery.where(root.<Integer> get("id").in(parameter));
TypedQuery<User> query = em.createQuery(criteriaQuery);
query.setParameter(parameter, Arrays.asList(1, 2));
List<User> resultList = query.getResultList();
this doesn't:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
Root<User> root = criteriaQuery.from(User.class);
criteriaQuery.where(root.<Integer>
get("id").in(builder.parameter(Collection.class, "ids")));
TypedQuery<User> query = em.createQuery(criteriaQuery);
query.setParameter("ids", Arrays.asList(1, 2));
List<User> resultList = query.getResultList();
The latter again fails with the exception:
Filter invalid. Cannot compare field id of type java.lang.Integer to value of
type java.util.List. Numeric comparisons must be between numeric types only. To
enable such comparisons for backwards-compatibility, add
"QuotedNumbersInQueries=true" to the org.apache.openjpa.Compatibility setting
in your configuration.; nested exception is <openjpa-2.3.0-r422266:1540826
nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Filter
invalid. Cannot compare field id of type java.lang.Integer to value of type
java.util.Collection. Numeric comparisons must be between numeric types only.
To enable such comparisons for backwards-compatibility, add
"QuotedNumbersInQueries=true" to the org.apache.openjpa.Compatibility setting
in your configuration.
> Cannot bind String[] to ParameterExpression for path.in(parameter)
> ------------------------------------------------------------------
>
> Key: OPENJPA-2018
> URL: https://issues.apache.org/jira/browse/OPENJPA-2018
> Project: OpenJPA
> Issue Type: Bug
> Components: jpa
> Affects Versions: 2.1.0
> Reporter: Oliver Gierke
> Assignee: Mark Struberg
> Labels: binding, criteria_api, jpa
> Fix For: 2.3.0
>
> Attachments: OPENJPA-2018-test-update.patch,
> OPENJPA-2018-test2.patch, OPENJPA-2018-with-array.patch, OPENJPA-2018.patch,
> missingpatch.patch, openjpa-2018.zip
>
>
> Given the following code:
> {code}
> User user = new User("Dave", "Matthews", "[email protected]");
> em.persist(user);
> em.flush();
> CriteriaBuilder builder = em.getCriteriaBuilder();
> CriteriaQuery<User> criteria = builder.createQuery(User.class);
> Root<User> root = criteria.from(User.class);
> criteria.where(root.get("firstname").in(builder.parameter(String[].class)));
> TypedQuery<User> query = em.createQuery(criteria);
> for (ParameterExpression parameter : criteria.getParameters()) {
> query.setParameter(parameter, new String[] {"Dave", "Carter"});
> }
> List<User> result = query.getResultList();
> assertThat(result.isEmpty(), is(false));
> {code}
> I get a
> {code}
> <openjpa-2.0.0-r422266:935683 nonfatal user error>
> org.apache.openjpa.persistence.ArgumentException: The specified parameter of
> type "class [Ljava.lang.String;" is not a valid query parameter.
> {code}
> Using {{Collection}} as {{ParameterExpression}} type and binding the
> parameters via {{Arrays.asList(...)}} works fine.
--
This message was sent by Atlassian JIRA
(v6.2#6252)