You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Patrick Linskey (JIRA)" <ji...@apache.org> on 2010/06/30 00:56:50 UTC

[jira] Created: (OPENJPA-1711) missing optimization in JPQL queries that traverse the @Id field in an abstract unmapped entity

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.