[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-4630) Criteria join on composite identifier generates wrong alias, SQL error
David Mansfield (JIRA)
noreply at atlassian.com
Tue Jul 12 15:04:15 EDT 2011
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-4630?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=42945#comment-42945 ]
David Mansfield commented on HHH-4630:
--------------------------------------
I have taken the test and fix supplied by Chris and updated the fix against 3.6 latest and 4.0 latest. I have created two pull requests on github:
3.6:
https://github.com/hibernate/hibernate-core/pull/126
4.0
https://github.com/hibernate/hibernate-core/pull/123
> Criteria join on composite identifier generates wrong alias, SQL error
> ----------------------------------------------------------------------
>
> Key: HHH-4630
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4630
> Project: Hibernate Core
> Issue Type: Patch
> Components: core
> Affects Versions: 3.5.0-Beta-3, 3.5.1
> Environment: Hibernate trunk from 2009-11-30, Ubuntu 8.04, Sun Java 1.6.0-17, MySQL 5.0.51a-3ubuntu5.4
> Reporter: Chris Wilson
> Assignee: Gail Badner
> Attachments: hibernate-HHH-4630-invalid-alias-generation-updated-3.5.1.patch, hibernate-invalid-alias-generation.patch, hibernate-invalid-alias-generation.patch
>
> Original Estimate: 1h
> Remaining Estimate: 1h
>
> Hibernate generates the wrong alias on a Criteria query involving a join
> on a composite identifier. For example, in the test below without the fix
> to JoinWalker, it generates this SQL:
> select
> this_.role_code as role1_0_1_,
> this_.is_deleted as is2_0_1_,
> this_.record_version as record3_0_1_,
> complexjoi3_.code as code1_0_,
> complexjoi3_.is_deleted as is2_1_0_,
> complexjoi3_.record_version as record3_1_0_
> from
> list_action_roles this_
> left outer join
> roles complexjoi3_
> on this_.role_code=complexjoi3_.code
> where
> this_.is_deleted=?
> and complexjoi1_.is_deleted=?
>
> Which results in this error from the SQL server:
>
> Unknown column 'complexjoi1_.is_deleted' in 'where clause'
> Analysis of the problem:
> The entity persister class with the composite identifier has a fake
> property for it, called "_identifierMapper" (see HbmBinder.bindCompositeId()
> and similarly in Annotations). This property name ends up in the path
> used by JoinWalker.walkEntityTree() when it calls walkComponentTree().
> However that path is used by CriteriaJoinWalker.generateTableAlias()
> to look up the correct criteria (and hence the alias) from the
> translator, a CriteriaQueryTranslator.
> The alias was created in CriteriaQueryTranslator.createCriteriaSQLAliasMap
> for a Criteria without this extra _identifierMapper path component.
> So when CriteriaJoinWalker tries to use the path with _identifierMapper
> to look up the criteria to find the correct alias to use, in
> generateTableAlias(), it doesn't find one, so it generates a new alias.
> That new alias no longer matches the one that will be rendered out in
> the WHERE clause, so the WHERE clause will refer to table names using
> aliases that are not used anywhere else in the query, and the SQL server
> will fail to parse the statement.
> The solution appears to be to exclude "_identifierMapper" components in
> the alias path when building it. I don't know what other implications
> that might have, but it seems like an implementation nastiness that
> shouldn't be exposed.
> Patch attached.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list