users@glassfish.java.net

Re: sth doubt about using left out join under Toplink Essentials

From: Wu Jie <wujie_at_cn.fujitsu.com>
Date: Wed, 30 Jul 2008 14:41:39 +0800

Hello Gordon

BTW: Some mistake in the descriptor of my test.
>>> ========================================================================
>>> EntityManagerFactory emf = Persistence.createEntityManagerFactory("testsqlPU"); (1)
>>> EntityManager em = emf.createEntityManager(); (2)
>>> Query query = em.createQuery("SELECT o from Person o LEFT OUTER JOIN o.persons");(3)
>>> List<Person> list = (List<Person>) query.getResultList() ; (4)
>>> ========================================================================
In line 3, it should not be LEFT OUTER JOIN, please refer to following.
Query query = em.createQuery("SELECT o from Person o LEFT JOIN FETCH o.persons");

Thanks.
Wu.

Wu Jie さんは書きました:
> Hello Gordon
> CC: GF) Dev Teams
>
> Thanks for your reply and some inline comment.
>
>> The query generated performs a JOIN from the join table to the target
>> table providing a set of all related objects. Then an outer join is
>> performed from the source table to the target table providing a set of
>> all persons (those with and without related objects). An outer join is
>> not needed from the join table to the target table because there is no
>> entry in the join table that does not have a corresponding row in the
>> target table. That is the nature of a join table. In separate queries
>> issue a JOIN and an OUTER JOIN between the join table and the target
>> table and see that the same rows are always returned.
>
> Here is an assumption: if the database does not support INNER JOIN,
> can we use LEFT OUT JOIN instead of JOIN in the situation described in
> my previous mail? (the JOIN in line 390 of SQLSelectStatement.)
>
> Thanks.
> Wu.
>
> Gordon Yorke さんは書きました:
>> Hello Wu,
>> The query generated performs a JOIN from the join table to the target
>> table providing a set of all related objects. Then an outer join is
>> performed from the source table to the target table providing a set of
>> all persons (those with and without related objects). An outer join is
>> not needed from the join table to the target table because there is no
>> entry in the join table that does not have a corresponding row in the
>> target table. That is the nature of a join table. In separate queries
>> issue a JOIN and an OUTER JOIN between the join table and the target
>> table and see that the same rows are always returned.
>>
>> If you actually have a join table that can include nulls from a legacy
>> implementation (very rare) then you will need to map this relationship
>> through an association class with a OneToMany and a OneToOne mapping as
>> this sort of structure is not supported by the ManyToManyMapping.
>> --Gordon
>>
>> Wu Jie wrote:
>>> Hi Peter
>>> Hi GF) Dev Teams,
>>> Hi Everyone,
>>>
>>> I have some doubt about using "left out join" under TopLink Essentials(TLE for short).
>>>
>>> 1. background of doubt
>>> when I do some test about using "left out join" for the entity which has
>>> m:m or 1:m relationship,I am eager to know that how TLE parses the m:m or
>>> 1:m relationship.
>>> the test what I did as follows: (Database is DB2)
>>>
>>> ========================================================================
>>> EntityManagerFactory emf = Persistence.createEntityManagerFactory("testsqlPU"); (1)
>>> EntityManager em = emf.createEntityManager(); (2)
>>> Query query = em.createQuery("SELECT o from Person o LEFT OUTER JOIN o.persons");(3)
>>> List<Person> list = (List<Person>) query.getResultList() ; (4)
>>> ========================================================================
>>> The JPQL in line 3 is parsed into the following SQL in runtime:
>>>
>>> "SELECT t0.ID, t0.NAME, t1.ID, t1.NAME FROM {oj PERSON t0 LEFT OUTER JOIN (PERSON_PERSON t2 JOIN PERSON t1 ON (t1.ID = t2.persons_ID)) ON (t2.Person_ID = t0.ID)}"
>>>
>>> 2. my research and doubt
>>> How TLE parses the JPQL into the above SQL?
>>>
>>> I tracked into the source code of TLE and located at SQLSelectStatement Class.
>>> (oracle.toplink.essentials.internal.expressions.SQLSelectStatement)
>>> the method appendFromClauseForOuterJoin() of SQLSelectStatement does the parse.
>>>
>>> I cite the comment of line 365-368 of SQLSelectStatement below.
>>> ========================================================================
>>> // Must outerjoin each of the targets tables.
>>> // The first table is joined with the mapping join criteria,
>>> // the rest of the tables are joined with the additional join criteria.
>>> // For example: EMPLOYEE t1 LEFT OUTER JOIN (PROJ_EMP t3 LEFT OUTER JOIN PROJECT t0 ON (t0.PROJ_ID = t3.PROJ_ID)) ON (t3.EMP_ID = t1.EMP_ID)
>>> ========================================================================
>>>
>>> We can learn that we should use the "LEFT OUTER JOIN" for parsing
>>> m:m or 1:m relationship from the comment, however in fact TLE uses "JOIN"
>>> in line 390 of SQLSelectStatement.
>>>
>>> So I have two questions.
>>> 1. The meaning of using "JOIN" instead of "LEFT OUTER JOIN".
>>> 2. If using "LEFT OUTER JOIN",is there any problem?
>>>
>>> Could you please help me to give some suggestion and if possible,
>>> resolve the above 2 questions and supply some useful material.
>>>
>>> Appreciate Ahead!
>>>
>>> Thanks.
>>> Wu.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ejb-unsubscribe_at_glassfish.dev.java.net
> For additional commands, e-mail: ejb-help_at_glassfish.dev.java.net
>
>
>

-- 
-----------------------------------------------------------
Wu Jie TEL: +86+25-86630566-915 EMAIL: wujie_at_cn.fujitsu.com
-----------------------------------------------------------