missing optimization in JPQL queries that traverse the @Id field in an abstract 
unmapped entity
-----------------------------------------------------------------------------------------------

                 Key: OPENJPA-1711
                 URL: https://issues.apache.org/jira/browse/OPENJPA-1711
             Project: OpenJPA
          Issue Type: Bug
          Components: query
    Affects Versions: 2.0.0
            Reporter: Patrick Linskey
            Priority: Minor


I have a one-to-many relationship between a concrete class and an abstract 
class. The abstract class is unmapped, and uses table-per-class inheritance, 
and there are a number of concrete subclasses implementing that abstract class.

My object model is as follows: PermissionableEntity is the abstract entity, and 
PermissionEntryEntity is a concrete entity with a field of type 
PermissionableEntity called 'permissionable' marked @ManyToOne.

When I perform the following query, things work well:

    select p from PermissionEntryEntity p where p.member = ?1 and 
p.permissionable in (?2)

However, when I attempt to dereference the id field (which is marked @Id), I 
get an exception [1]:

    select p from PermissionEntryEntity p where p.member = ?1 and 
p.permissionable.id in (?2)

The exception complains that OpenJPA can't dig into the abstract type since its 
fields are not mapped to a common table. Which is fair enough, except that the 
id field is already resident in the PermissionEntryEntity class and its 
corresponding table (which is why the first query works fine). OpenJPA is smart 
enough to do this optimization, but is getting short-circuited by the 
unjoinable check.

OpenJPA should at the least have an improved error message in the case where 
the field being traversed to is part of the primary key; at best, it should 
handle this query automatically.


[1] The exception that I get when attempting to dig into the object:

<openjpa-2.0.0-r422266:935683 fatal user error> 
org.apache.openjpa.persistence.ArgumentException: Cannot join across 
"com.example.entity.PermissionEntryEntity.permissionable".  The related type 
has unjoined subclasses.
        at 
org.apache.openjpa.jdbc.meta.strats.RelationStrategies.unjoinable(RelationStrategies.java:54)
        at 
org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy.joinRelation(RelationFieldStrategy.java:921)
        at 
org.apache.openjpa.jdbc.meta.FieldMapping.joinRelation(FieldMapping.java:983)
        at 
org.apache.openjpa.jdbc.kernel.exps.PCPath.joinRelation(PCPath.java:825)
        at 
org.apache.openjpa.jdbc.kernel.exps.PCPath.traverseField(PCPath.java:804)
        at 
org.apache.openjpa.jdbc.kernel.exps.PCPath.initialize(PCPath.java:579)
        at 
org.apache.openjpa.jdbc.kernel.exps.InExpression.initialize(InExpression.java:70)
        at 
org.apache.openjpa.jdbc.kernel.exps.AndExpression.initialize(AndExpression.java:48)
        at 
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.initialize(SelectConstructor.java:231)
        at 
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.newSelect(SelectConstructor.java:172)
        at 
org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.evaluate(SelectConstructor.java:87)
        at 
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.createWhereSelects(JDBCStoreQuery.java:349)
        at 
org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeQuery(JDBCStoreQuery.java:187)
        at 
org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeQuery(ExpressionStoreQuery.java:753)
        at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1003)
        at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:861)
        at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:792)
        at 
org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542)
        at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:288)
        at 
org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:302)


-- 
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