Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/Development/JPA 2.0/entity type expressions"

Line 15: Line 15:
 
3) Type expresions also need to operate on expressions representing relationships and entities, allowing them all to be compared
 
3) Type expresions also need to operate on expressions representing relationships and entities, allowing them all to be compared
 
===Public API===
 
===Public API===
  * <source lang="java">public Expression getClassForInheritance()</source>
+
  * <source lang="java">public Expression type()</source>
 
returns a Type expression operating on the base expression.  The base expression must be an ObjectExpression.  Examples:
 
returns a Type expression operating on the base expression.  The base expression must be an ObjectExpression.  Examples:
   <source lang="java">expressionBuilder.get("project").getClassForInheritance().equals(LargeProject.class) </source>   
+
   <source lang="java">expressionBuilder.get("project").type().equals(LargeProject.class) </source>   
  
===Open Issues===
+
Type chosen as it mirrors the proposed Criteria API in the JPA 2.0 specCalling type() is only valid on relationship query keys and other object type expressionsThese object expressions must correlate to descriptors that have inheritance that use a discriminator field, or an invalidTypeExpression will be thrown.  For intance:
Method name for the public expression apiThe getClassForInheritance() used above was arbitrarily picked because getType() is difficult to interpret when reading expression codeOther options might be getEntityType() or getClassType().
+
  <source lang="java">expressionBuilder.get("firstName").get("project").type().equals(LargeProject.class) </source>
 +
Where firstName is a string attribute would result in QueryException:"Invalid Type Expression on [{0}].  The class does not have a descriptor, or a descriptor that does not use inheritance or uses a ClassExctractor for inheritance"
 
    
 
    
  
Line 27: Line 28:
 
#: approx 1 day
 
#: approx 1 day
 
# Update Processing
 
# Update Processing
#: approx 6 days - creating expression support: EclipseLink [http://bugs.eclipse.org/277509 Enhancement 277509]
+
#: approx 6 days - creating expression support: EclipseLink [http://bugs.eclipse.org/277509 Enhancement 277509] Completed
 
#: approx 3 days - updating Parser
 
#: approx 3 days - updating Parser

Revision as of 14:35, 2 June 2009

Entity Type Expression

JPA 2.0 Root | bug 252009

Issue Summary

JPA 2.0 introduces JPQL expressions that allow a query to restrict results based on class types. This feature will require functionality to be added to EclipseLink.

See JPA 2.0 section 4.4.8 and 4.4.9 for details.

General Solution

Expression Support will be required that can provide a comparison with an extracted discriminator value.

Native Expression Support

through EclipseLink Enhancement 277509 1)ReportQuery will need return Class objects that the Type expression correlates to 2) Type expressions need to be supported that take parameters and constants representing Java Classes that will evaluate to String/Int values used in these class's inheritance policy fields 3) Type expresions also need to operate on expressions representing relationships and entities, allowing them all to be compared

Public API

*
public Expression type()

returns a Type expression operating on the base expression. The base expression must be an ObjectExpression. Examples:

expressionBuilder.get("project").type().equals(LargeProject.class)

Type chosen as it mirrors the proposed Criteria API in the JPA 2.0 spec. Calling type() is only valid on relationship query keys and other object type expressions. These object expressions must correlate to descriptors that have inheritance that use a discriminator field, or an invalidTypeExpression will be thrown. For intance:

expressionBuilder.get("firstName").get("project").type().equals(LargeProject.class)

Where firstName is a string attribute would result in QueryException:"Invalid Type Expression on [{0}]. The class does not have a descriptor, or a descriptor that does not use inheritance or uses a ClassExctractor for inheritance"


Work Required

  1. Develop model for testing
    approx 1 day
  2. Update Processing
    approx 6 days - creating expression support: EclipseLink Enhancement 277509 Completed
    approx 3 days - updating Parser

Back to the top