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

Chris Wilson (JIRA) noreply at atlassian.com
Tue Dec 1 10:05:08 EST 2009


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