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

Reply via email to