openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Marc Prud'hommeaux <mprud...@apache.org>
Subject Re: Does OpenJPA support updating of related objects via JPQL?
Date Mon, 18 Sep 2006 20:40:45 GMT
Kevin-

On Sep 18, 2006, at 11:19 AM, Kevin Sutter wrote:

> Thanks Craig and Marc,
> I had found this reference in the spec, but it still wasn't clear  
> to me.
> Maybe I'm reading it wrong, but the BNF states (in Section 4.10):
>
> update_item ::= [identification_variable.] {state_field |
> single_valued_association_field} = new_value
>
> I couldn't find the definition of the  
> "single_valued_association_field".  I
> was wondering if there was any implication that this might allow for
> referenced fields.  But, as I continue to look at the spec, I  
> suppose if
> that was to be allowed, they would have specified
> "single_valued_association_path_expression"?  Is that the way you  
> guys are
> reading the spec?

Yeah, they seem to have left "single_valued_association_field" out of  
the BNF, only describing it textually:

"A single_valued_association_field is designated by the name of an  
association-field in a one-to-one or many-to-one relationship. The  
type of a single_valued_association_field and thus a  
single_valued_association_path_expression is the abstract schema type  
of the related entity."

This is a little vague, but give the following path expression BNF:

single_valued_association_path_expression ::= identification_variable. 
{single_valued_association_field.}*single_valued_association_field

... I think it is reasonable to infer that  
"single_valued_association_field" is meant to only be a single field,  
not a series of fields (or else the "*" would not be required).

(in any case, even if the BNF did support it, the OpenJPA back-end  
doesn't efficiently handle anything but updating the top-level fields  
of an entity, so it would be more than just a matter of extending/ 
fixing the parser to support this)



> Even the BNF for "state field" implies that this would work if  
> currentOrder
> was an embedded class...
>
> state_field ::= {embedded_class_state_field.}*simple_state_field
>
> Thanks,
> Kevin
>
> On 9/18/06, Craig L Russell <Craig.Russell@sun.com> wrote:
>>
>> Hi,
>>
>> The JPQL BNF prohibits this operation. From 4.10:
>>
>> update_statement ::= update_clause [where_clause]
>> update_clause ::=UPDATE abstract_schema_name [[AS]
>> identification_variable]
>> SET update_item {, update_item}*
>> update_item ::= [identification_variable.]{state_field |
>> single_valued_association_field}=
>> new_value
>>
>> The update_item must be an identification variable followed by a
>> single "." with a state field or single-valued association field, so
>> no embedded object.
>>
>> Craig
>>
>> On Sep 18, 2006, at 9:37 AM, Kevin Sutter wrote:
>>
>> > Hi,
>> > Does OpenJPA (or JPA, for tha matter) support the updating of  
>> related
>> > objects via JPQL?  For example, should the following query work
>> > where we are
>> > attempting to access the orderId on the related currentOrder  
>> object?
>> >
>> > UPDATE Customer c SET c.currentOrder.orderId = :orderId WHERE  
>> c.id =
>> > :customerId
>> >
>> > As you can guess, we are getting an exception and call stack from
>> > OpenJPA.
>> > But, then we started wondering whether this is even supported by
>> > the JPA
>> > spec.  The spec isn't clear one way or the other (or, at least, I
>> > couldn't
>> > find a definitive answer).  Any ideas?
>> >
>> > In case you were wondering, here's the call stack:
>> >
>> > [9/16/06 16:15:52:953 EDT] 00000032 ExceptionUtil E   CNTR0020E:
>> > EJB threw
>> > an unexpected (non-declared) exception during invocation of method
>> > "openOrder" on bean "BeanId
>> > (OpenJPATestEAR#OpenJPATest.jar#OrderEJB, null)".
>> > Exception data: <4|false|0.9.0-incubating-SNAPSHOT>
>> > org.apache.openjpa.persistence.ArgumentException: An error occurred
>> > while
>> > parsing the query filter 'UPDATE Customer c SET
>> > c.currentOrder.orderId =
>> > :orderId WHERE c.id = :customerId'. Error message:
>> > <4|false|0.9.0-incubating-SNAPSHOT>
>> > org.apache.openjpa.kernel.jpql.ParseException: Encountered "." at
>> > character
>> > 37, but expected: ["="].
>> >    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder
>> > $ParsedJPQL.parse
>> > (JPQLExpressionBuilder.java:1655)
>> >    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder 
>> $ParsedJPQL
>> > .<init>(JPQLExpressionBuilder.java:1638)
>> >    at org.apache.openjpa.kernel.jpql.JPQLParser.parse
>> > (JPQLParser.java:44)
>> >    at  
>> org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(
>> > ExpressionStoreQuery.java:141)
>> >    at org.apache.openjpa.kernel.QueryImpl.newCompilation
>> > (QueryImpl.java
>> > :598)
>> >    at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(
>> > QueryImpl.java:581)
>> >    at org.apache.openjpa.kernel.QueryImpl.compileForExecutor
>> > (QueryImpl.java
>> > :608)
>> >    at org.apache.openjpa.kernel.QueryImpl.getOperation
>> > (QueryImpl.java:1421)
>> >    at org.apache.openjpa.kernel.DelegatingQuery.getOperation(
>> > DelegatingQuery.java:120)
>> >    at org.apache.openjpa.persistence.QueryImpl.executeUpdate
>> > (QueryImpl.java
>> > :293)
>> > :
>> > :
>> >
>> > Thanks,
>> > Kevin
>>
>> Craig Russell
>> Architect, Sun Java Enterprise System http://java.sun.com/products/ 
>> jdo
>> 408 276-5638 mailto:Craig.Russell@sun.com
>> P.S. A good JDO? O, Gasp!
>>
>>
>>
>>


Mime
View raw message