Alexander Falb created OPENJPA-2688:
---------------------------------------
Summary: JPQL "IN (:collection)" vs "IN :collection"
Key: OPENJPA-2688
URL: https://issues.apache.org/jira/browse/OPENJPA-2688
Project: OpenJPA
Issue Type: Bug
Affects Versions: 2.4.2, 3.0.0
Reporter: Alexander Falb
Both of the following JPQL queries work in OpenJPA, as long as there is at
least one element in the collection
{code}
SELECT a FROM EntityA a WHERE a.val IN (:collection)
SELECT a FROM EntityA a WHERE a.val IN :collection
{code}
When the collection is empty, only the first query works, the second one throws
an IllegalArgumentException("empty-collection-parm").
The problem seems to be in the difference between
{code}org.apache.openjpa.jdbc.kernel.exps.InExpression#getCollection(ExpContext
ctx, ExpState state){code}
which handles the first syntax and
{code}org.apache.openjpa.jdbc.kernel.exps.CollectionParam#calculateValue(Select
sel, ExpContext ctx, ExpState state, Val other, ExpState otherState){code}
for the second syntax.
InExpression just collects all parameters between the parenthesis in a
collection, where as CollectionParam does a few sanity checks first and throws
aforementioned exception.
In my opinion the behaviour should be the same OR the first syntax should not
be allowed altogether, because it violates the JPQL definition for IN
expressions:
{code}
in_expression ::=
{state_valued_path_expression | type_discriminator} [NOT] IN
{ ( in_item {, in_item}* ) | (subquery) |
collection_valued_input_parameter }
in_item ::= literal | single_valued_input_parameter
{code}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)