The JPA spec (Version 2.0, 2.1 and 2.2 at least) doesn’t allow the use of collections as parameters in constructor expressions. Section 4.8 defines a constructor expression like this:
constructor_expression ::=
NEW constructor_name ( constructor_item {, constructor_item}* )
constructor_item ::=
single_valued_path_expression |
scalar_expression |
aggregate_expression |
identification_variable
A single_valued_path_expression
is what it sounds like – a property expression that points to a scalar of some sort (such as p.id
), a scalar_expression
is also an expression that points to scalar, an aggregate_expression
is the application of a function like sum
which reduces a multi-valued expression to a scalar one, and an identification_variable
is a reference to the type you’re querying over. None of which can be collection-valued.
So, if your JPA provider lets you use collection-valued parameter in a constructor expression, it’s because it’s going above and beyond the spec. Which is very nice of it, but not something you can necessarily rely on!