You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by "Dave Lamy (JIRA)" <ji...@apache.org> on 2010/11/05 16:02:42 UTC
[jira] Created: (CAY-1502) EJBQLJoinAppender uses the same SQL
table alias for many-many tables every time they are joined in
EJBQLJoinAppender uses the same SQL table alias for many-many tables every time they are joined in
--------------------------------------------------------------------------------------------------
Key: CAY-1502
URL: https://issues.apache.org/jira/browse/CAY-1502
Project: Cayenne
Issue Type: Bug
Components: Core Library
Affects Versions: 3.0.1
Reporter: Dave Lamy
Priority: Minor
EJBQLJoinAppender will create a SQL table alias for many-many join tables, but it does not have an EJBQL alias to work with as a key since these tables are not referenced in EJBQL. The problem is that if a many-many table is referenced in the same query multiple times but from different contexts, the SQL generation will wind up joining to the table multiple times with the same alias, which is invalid SQL.
Example EJBQL (test_class.parents are also of type test_class)
SELECT COUNT(distinct a.id) FROM test_class a LEFT JOIN a.parents b JOIN a.people c LEFT JOIN b.people d WHERE b.firstName = 'foo' OR d.firstName = 'foo'
basically creates
SELECT COUNT(DISTINCT t0.ID) AS sc0
FROM TEST_CLASS t0
LEFT OUTER JOIN TEST_CLASS t1 ON (t0.PARENT_ID = t1.ID) // a.parents
INNER JOIN TEST_CLASS_PEOPLE t2 ON (t0.ID = t2.TEST_CLASS_ID) // a.people, first half
JOIN PERSON t3 ON (t2.PERSON_ID = t3.ID) // a.people, second half
LEFT OUTER JOIN TEST_CLASS_PEOPLE t2 ON (t1.ID = t2.TEST_CLASS_ID) // b.people, first half, note the alias duplication
JOIN PERSON t5 ON (t2.PERSON_ID = t5.ID) // b.people, second half
WHERE t3.FIRST_NAME = 'foo' OR t5.FIRST_NAME = 'foo'
Note the reuse of the "t2" table alias for the join table.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.