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:04:55 UTC
[jira] Updated: (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:all-tabpanel ]
Pinaki Poddar updated OPENJPA-586:
----------------------------------
Attachment: patch-586.1.txt
This patch includes
a) source code modification: The binding parameter types are changed to declared type of the fields instead of their externalized types
b) test cases are added to verify the changes
> 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.