Hi,
I just ran into what I believe is a bug with the prepared SQL code. In
PreparedQueryImpl.reparameterize(), we have the following code:
> if (ImplHelper.isManageable(val)) {
> setPersistenceCapableParameter(result, val, indices, broker);
> } else if (val instanceof Collection) {
> setCollectionValuedParameter(result, (Collection)val, indices,
> key);
> }
This does not work if the parameter is a collection of persistence-capable
objects, as setCollectionValuedParameter assumes that the values are not PCs.
Is this expected, or am I running into a limitation of the prepared SQL work?
I briefly looked at patching this by modifying / refactoring setPCParameter()
so that I could invoke it from setCollectionValuedParameter(), but I'm confused
by another couple aspects of the prepared SQL code that I wanted to get my head
around first:
1. The query framework already knows how to convert a PC parameter into values;
I'm a bit surprised to see this code replicated in another part of the
framework. Additionally, I was surprised to see direct prepared SQL checks in
the openjpa-persistence module -- seems like this would pretty fully belong in
openjpa-jdbc. Do we have any design discussions that I can review to better
understand the work?
2. My query looks something like this:
> select e from Entity e where e.child in :children
Then, I execute the query with a Set<Child>, where Child is a persistent type
also. The query is translated into a SELECT statement with a single parameter,
as expected. However, the Set<Child> value itself is un-boxed, and it looks
like that (unboxed) value is pushed down into the SELECT statement. Which, as
far as I can tell, would mean that 'in' clauses won't work as expected.
Have we done any testing with multi-valued 'in' clauses + prepared SQL?
Thanks,
-Patrick
--
Patrick Linskey
202 669 5907