openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Dick (JIRA)" <j...@apache.org>
Subject [jira] Updated: (OPENJPA-894) LEFT JOIN FETCH queries with fresh fetches from the db do not follow JPA Spec 4.4.5.3
Date Fri, 23 Oct 2009 21:25:59 GMT

     [ https://issues.apache.org/jira/browse/OPENJPA-894?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Michael Dick updated OPENJPA-894:
---------------------------------

    Attachment: OPENJPA-894-scrollable-1.0.x.patch.txt

The idea of manually adding in the duplicates made me a little nervous. I've attached an alternate
approach which uses scrollable result sets if we detect a left join fetch (as indicated by
the presence of joins in the fetch plan).

When a Left Join Fetch is used we'll process the resultSet as we normally do, but rewind back
to the original position after processing the eager results. The changes should only affect
LJF queries which might see a slight drop in performance for using scrollable result sets.



> LEFT JOIN FETCH queries with fresh fetches from the db do not follow JPA Spec 4.4.5.3
> -------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-894
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-894
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: query
>    Affects Versions: 1.2.0
>         Environment: Any, tested with Windows
>            Reporter: Jody Grassel
>         Attachments: FetchJoinTest.zip, OPENJPA-894-scrollable-1.0.x.patch.txt, OPENJPA-894.patch
>
>
> Discovered what seems to be a break with JPA Specification 1.0, section 4.4.5.3 (Fetch
Joins).  The query in question uses the  LEFT JOIN FETCH sematic, so there is the expectation
that the result list will contain a copy of the entity reference for every match on the right
side of the join (the spec uses the example with the query "SELECT d FROM department d LEFT
JOIN FETCH d.employees WHERE d.deptno = 1" where 5 employees are members of department(pk=1)
the resultlist should have 5 copies of Department(pk=1). )
> Now, if I create all of the entities, persist them to the database, but do not clear
the persistence context (leaving all the new entities managed by the persistence context still),
the query performs as expected.  I get multiple copies of the entity I issued the query for,
one for each item successfully matching the LEFT JOIN FETCH.  In the example I will update
shortly, I get:
>  [junit] --------------------------------------------------
>  [junit] Executing testQuery001
>  [junit] Executing named query getAGroup with intData=42 ...
>  [junit] ResultList size: 8
>  [junit] 1 EntityA(id=1): 42, Entity A - PK 1
>  [junit] 1 EntityA(id=1): 42, Entity A - PK 1
>  [junit] 1 EntityA(id=1): 42, Entity A - PK 1
>  [junit] 1 EntityA(id=1): 42, Entity A - PK 1
>  [junit] 1 EntityA(id=2): 42, Entity A - PK 2
>  [junit] 1 EntityA(id=2): 42, Entity A - PK 2
>  [junit] 1 EntityA(id=2): 42, Entity A - PK 2
>  [junit] 1 EntityA(id=2): 42, Entity A - PK 2
> However, if I clear the persistence context, forcing OpenJPA to make a fetch from the
database, I only get unique instances of the entity I issued the query for, not multiple copies
for each match on the right side of the join.
> [junit] --------------------------------------------------
> [junit] Executing testQuery002
> [junit] Clearing persistence context...
> [junit] Executing named query getAGroup with intData=42 ...
> [junit] ResultList size: 2
> [junit] 1 EntityA(id=1): 42, Entity A - PK 1
> [junit] 1 EntityA(id=2): 42, Entity A - PK 2
> Both tests use the exact same code for everything, except testQuery002 does a em.clear()
before running the query.

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