Query Parameter processing in JPA 2.0
-------------------------------------

                 Key: OPENJPA-1180
                 URL: https://issues.apache.org/jira/browse/OPENJPA-1180
             Project: OpenJPA
          Issue Type: Improvement
          Components: jpa, kernel, query
            Reporter: Pinaki Poddar
            Assignee: Pinaki Poddar


JPA 2.0 has defined new APIs for Query parameter processing as well as new 
Parameter<T> and ParameterExpression<T> interface.
OpenJPA, so far, did not abstract or distinguish query parameters with an 
explicit type definition, and only maintained  parameter values in Map or 
array. 

To support JPA 2.0, parameter processing in OpenJPA will undergo following 
changes (which may impact other parts of the code)

This task will
a) introduce an explicit QueryParameter interface
b) provide implementation of the same for query and CriteriaQuery. 

Having an explicit Parameter instance moves the value of the parameter as an 
attribute of the parameter itself and hence the Map<key,value> that a query 
maintained for holding the parameters will now change from Map<String,Object> 
to Map<String,QueryParameter>. To make the callers oblivious of this data 
structural change (as they expect to receive a Map<String,Object> where values 
are Parameter values rather than the Parameter instances themselves), new 
methods will appear in facade QueryImpl.   

CriteriaQuery poses another aspect to query parameter processing. The 
parameters used in CriteriaQuery is modeled as Expression and created by 
QueryBuilder factory. However, the parameters used in a CriteriaQuery c must be 
registered to the executable Query instance  q, because the parameter values 
can only be set via methods on q. This registration requires that the 
expression tree of c be walked to detect all its parameters when q is 
constructed of c. This aspect requires a change in the flow of control in the 
initial architecture of CriteriaQuery implementation. 
Care must be taken to ensure that the CriteriaQuery expression tree is not 
walked twice (once merely to detect the parameters and once to form the 
executable query expression for the data store). 

Also parameters of CriteriaQuery *may not* be explicitly named (positional 
parameters are not permitted by spec for CriteriaQuery anyway). The unnamed 
parameter requires the implementation to auto-assign a name to the parameter 
because the maps that contain these parameters require a non-null key. 



 

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

Reply via email to