[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-4630) Criteria join on composite identifier generates wrong alias, SQL error

Gail Badner (JIRA) noreply at atlassian.com
Tue Apr 20 15:36:20 EDT 2010


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-4630?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=36513#action_36513 ] 

Gail Badner commented on HHH-4630:
----------------------------------

Hi Chris, 

Please check if this is still an issue in 3.5.1 and let us know.

Thanks,
Gail

> 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
>         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
>         Attachments: 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.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list