You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Pinaki Poddar (JIRA)" <ji...@apache.org> on 2008/05/02 00:10:55 UTC

[jira] Commented: (OPENJPA-586) Binding Query parameter fails validation for Externalized field

    [ https://issues.apache.org/jira/browse/OPENJPA-586?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12593658#action_12593658 ] 

Pinaki Poddar commented on OPENJPA-586:
---------------------------------------

Here is snippet from Section 4.6.4.1 "Positional Parameters" of JPA 1.0 Spec:
"An input parameter evaluates to the abstract schema type of the corresponding parameter defined in the signature of the finder or select method with which the query is associated. It is the responsibility of the persistence provider to map the input parameter to the appropriate abstract schema type value".  

Subjected to our interpretaion of "evaluates", the above directive seems to suggest that, for the given example, the runtime type of the binding parameter can be either java.util.UUID or java.lang.String. And OpenJPA documentation also seems to agree.

However, with current implementation, it may be non-trivial to validate the query parameter at JPA-façade layer for *both* types. It is rather prudent to restrict the user-supplied binding parameter be of declared type only (i.e. java.util.UUID) and not the externalized type (i.e. java.lang.String).   
That is what the attached patch (patch-586.1.txt) does.

> Binding Query parameter fails validation for Externalized field
> ---------------------------------------------------------------
>
>                 Key: OPENJPA-586
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-586
>             Project: OpenJPA
>          Issue Type: Bug
>            Reporter: Pinaki Poddar
>         Attachments: patch-586.1.txt
>
>
> OpenJPA supports a field f of declared type <T> be persisted in database corresponding to a different type <S> when  f specifies a two-way transformation between <S> and <T>. For example, a field f can be declared as java.net.URL but stored in database as String (i.e. VARCHAR). 
> Now the question is:
>     When an 'externalized' field f occurs in query predicate and is bound by a parameter p what should be the runtime type of p? 
>    The documentation [1] says p can be of either <T> or <S>.
> But the code breaks during parameter validation if Class(p) = <T> and with data conversion error if Class(p) = <S>
> Example:
> 1.   Declare a persistent field f of type java.util.UUID externalized to java.lang.String with a pair of transformer functions
>     @Persistent
>     @Externalizer("toString")        
>     @Factory("UUID.fromString")
>     private UUID    uuid;
> 2. Use the field f in a Query with a binding parameter:
>         String jpql = "SELECT p FROM ExternalValues p WHERE p.uuid=:uuid";
>         Query query = em.createQuery(jpql);
> 3. Try to set parameter on the query:
>          a) query.setParameter("uuid", new UUID(1,2));  // parameter type equals declared type of f
> or
>          b) query.setParameter(1, new UUID(1,2).toString()); // parameter type equals externalized type of f
> 4. Either of step 3a or 3b will result in runtime exception
> [1] http://openjpa.apache.org/docs/latest/manual/manual.html#ref_guide_pc_extern

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.