openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Xiaoqin Feng (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-717) OpenJPA doesn't generate SQL with efficient joins when joined inheritance strategy is used and there is one-many relation in superclass
Date Thu, 04 Sep 2008 22:31:44 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-717?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12628492#action_12628492
] 

Xiaoqin Feng commented on OPENJPA-717:
--------------------------------------

In JDBCStoreManager.selectBaseMappings(), it recursively call parent class selectBaseMappings().
For one-to-one relationship in parent class fms[i].selectEagerJoin(sel, sm, this, fetch.traverseJDBC(fms[i]),
eager) is called so join is added to join set.
When recursive call returns to subclass, sub-super join will add to join sets. 
That is the result you see in the first SQL.

For one-to-many relation, it calls fms[i].selectEagerParallel(esel, sm, this, fetch.traverseJDBC(fms[i]),
eager);
In current code design, it uses SelectExecutor and start with new join set in StoreCollectionFieldStrategy.selectEager().

So there is no way to have sub-super join info for one-to-many relation.

I will attach a test case later.



> OpenJPA doesn't generate SQL with efficient joins when joined inheritance strategy is
used and there is one-many relation in superclass
> ---------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-717
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-717
>             Project: OpenJPA
>          Issue Type: Improvement
>          Components: query
>    Affects Versions: 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.1.0, 1.2.0
>            Reporter: Xiaoqin Feng
>
> The test case has a subclass that extends an abstract superclass that 
> basically contains a single additional field 'S1', a one-to-one relation 'superOne' and
a one-to-many relation 'superMany'. The superclass has an 
> inheritance strategy of 'JOINED'. 
> When executing the query:
> SELECT s FROM Subclass s WHERE s.a1 = :a1
> three SQL statements get generated:
> SELECT t1.ID, t0.id, t1.S1, t2.ID, t2.S1, t0.A1, t3.ID, t3.A1 
> FROM SUBCLASS t0, SUPERCLASS t1, SUPERCLASSONE t2, SUBCLASSONE t3 
> WHERE (t0.A1 = ?) AND t0.SUBCLASSONE_ID = t3.ID(+) AND t0.id = t1.ID AND 
> t1.SUPERCLASSONE_ID = t2.ID(+)
> SELECT t0.id, t1.ID, t1.A1 
> FROM SUBCLASS t0, SUBCLASSMANY t1 
> WHERE (t0.A1 = ?) AND t0.id = t1.SUBCLASS_ID ORDER BY t0.id ASC
> SELECT t1.ID, t2.ID, t2.S1 
> FROM SUBCLASS t0, SUPERCLASS t1, SUPERCLASSMANY t2 
> WHERE (t0.A1 = ?) AND t1.ID = t2.SUPERCLASS_ID ORDER BY t1.ID ASC
> The third one doesn't contain the condition t0.ID = t1.ID
> Although final returned result set is correct because of the logical union, the third
SQL returns more rows  so it has bad performance.

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


Mime
View raw message