[hibernate-issues] [Hibernate-JIRA] Closed: (HHH-1030) No join clause for implied from element in AST query parser

Steve Ebersole (JIRA) noreply at atlassian.com
Mon Mar 21 13:00:51 EDT 2011


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1030?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Steve Ebersole closed HHH-1030.
-------------------------------


Closing stale resolved issues

> No join clause for implied from element in AST query parser
> -----------------------------------------------------------
>
>                 Key: HHH-1030
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1030
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.1 rc 1
>         Environment: 3.1 rc 1
> MS SQL Server 8.00.760
>            Reporter: Assaf Urieli
>         Attachments: aplikaterm.hbm.zip
>
>
> When migrating from Hibernate2 to Hibernate3, the following HQL:
> HQL: SELECT term.id, term.textDB, conformity.lastUpdateDate, conformity.sourceTerm.id, conformity.sourceTerm.textDB FROM com.joliciel.aplikaterm.domain.TermImpl AS term JOIN term.conformityDB as conformity JOIN conformity.submittedBy AS submittedBy,com.joliciel.aplikaterm.domain.OrganisationLevelCheckerImpl as organisationLevelChecker WHERE conformity.statusDB = :status AND submittedBy.organisation = organisationLevelChecker.organisation AND submittedBy != organisationLevelChecker AND NOT EXISTS (FROM com.joliciel.aplikaterm.domain.ConformityCheckerImpl AS conformityChecker WHERE conformityChecker.user.id=submittedBy.id) AND organisationLevelChecker.user = :pendingCheckBy ORDER BY conformity.lastUpdateDate
> Gets translated as:
> select termimpl0_.idTerme as col_0_0_, termimpl0_.texte as col_1_0_, conformity1_.dateModification as col_2_0_, conformity1_.idTerme_dOrigine as col_3_0_, termimpl4_.texte as col_4_0_ from Terme termimpl0_ inner join Conformite conformity1_ on termimpl0_.idTerme=conformity1_.idTerme inner join Utilisateur userimpl2_ on conformity1_.idSoumisPar=userimpl2_.idUtilisateur, Terme termimpl4_, Controlleur organisati3_ where organisati3_.typeDeControlleur='O' and conformity1_.statut=? and userimpl2_.idOrganisation=organisati3_.idOrganisation and userimpl2_.idUtilisateur<>organisati3_.idControlleur and  not (exists (select conformity5_.idControlleur from Controlleur conformity5_ where conformity5_.idUtilisateur=userimpl2_.idUtilisateur)) and organisati3_.idUtilisateur=?
> Note no inner join clause on the implied table termimpl4_ (though it is listed in the SQL AST below).
> If I turn on the classic parser, it gets translated correctly as:
> select termimpl0_.idTerme as col_0_0_, termimpl0_.texte as col_1_0_, conformity1_.dateModification as col_2_0_, conformity1_.idTerme_dOrigine as col_3_0_, termimpl5_.texte as col_4_0_ from Terme termimpl0_ inner join Conformite conformity1_ on termimpl0_.idTerme=conformity1_.idTerme inner join Utilisateur userimpl2_ on conformity1_.idSoumisPar=userimpl2_.idUtilisateur, Controlleur organisati3_, Terme termimpl5_ where organisati3_.typeDeControlleur='O' and conformity1_.idTerme_dOrigine=termimpl5_.idTerme and ((conformity1_.statut=? )AND(userimpl2_.idOrganisation=organisati3_.idOrganisation )AND(userimpl2_.idUtilisateur!=organisati3_.idControlleur )AND(NOT EXISTS(select conformity4_.idControlleur from Controlleur conformity4_ where (conformity4_.idUtilisateur=userimpl2_.idUtilisateur )))AND(organisati3_.idUtilisateur=? )) order by  conformity1_.dateModification
> Note inner join clause:
> conformity1_.idTerme_dOrigine=termimpl5_.idTerme
> --- HQL AST ---
>  \-[QUERY] 'query'
>     +-[SELECT_FROM] 'SELECT_FROM'
>     |  +-[FROM] 'FROM'
>     |  |  +-[RANGE] 'RANGE'
>     |  |  |  +-[DOT] '.'
>     |  |  |  |  +-[DOT] '.'
>     |  |  |  |  |  +-[DOT] '.'
>     |  |  |  |  |  |  +-[DOT] '.'
>     |  |  |  |  |  |  |  +-[IDENT] 'com'
>     |  |  |  |  |  |  |  \-[IDENT] 'joliciel'
>     |  |  |  |  |  |  \-[IDENT] 'aplikaterm'
>     |  |  |  |  |  \-[IDENT] 'domain'
>     |  |  |  |  \-[IDENT] 'TermImpl'
>     |  |  |  \-[ALIAS] 'term'
>     |  |  +-[JOIN] 'JOIN'
>     |  |  |  +-[DOT] '.'
>     |  |  |  |  +-[IDENT] 'term'
>     |  |  |  |  \-[IDENT] 'conformityDB'
>     |  |  |  \-[ALIAS] 'conformity'
>     |  |  +-[JOIN] 'JOIN'
>     |  |  |  +-[DOT] '.'
>     |  |  |  |  +-[IDENT] 'conformity'
>     |  |  |  |  \-[IDENT] 'submittedBy'
>     |  |  |  \-[ALIAS] 'submittedBy'
>     |  |  \-[RANGE] 'RANGE'
>     |  |     +-[DOT] '.'
>     |  |     |  +-[DOT] '.'
>     |  |     |  |  +-[DOT] '.'
>     |  |     |  |  |  +-[DOT] '.'
>     |  |     |  |  |  |  +-[IDENT] 'com'
>     |  |     |  |  |  |  \-[IDENT] 'joliciel'
>     |  |     |  |  |  \-[IDENT] 'aplikaterm'
>     |  |     |  |  \-[IDENT] 'domain'
>     |  |     |  \-[IDENT] 'OrganisationLevelCheckerImpl'
>     |  |     \-[ALIAS] 'organisationLevelChecker'
>     |  \-[SELECT] 'SELECT'
>     |     +-[DOT] '.'
>     |     |  +-[IDENT] 'term'
>     |     |  \-[IDENT] 'id'
>     |     +-[DOT] '.'
>     |     |  +-[IDENT] 'term'
>     |     |  \-[IDENT] 'textDB'
>     |     +-[DOT] '.'
>     |     |  +-[IDENT] 'conformity'
>     |     |  \-[IDENT] 'lastUpdateDate'
>     |     +-[DOT] '.'
>     |     |  +-[DOT] '.'
>     |     |  |  +-[IDENT] 'conformity'
>     |     |  |  \-[IDENT] 'sourceTerm'
>     |     |  \-[IDENT] 'id'
>     |     \-[DOT] '.'
>     |        +-[DOT] '.'
>     |        |  +-[IDENT] 'conformity'
>     |        |  \-[IDENT] 'sourceTerm'
>     |        \-[IDENT] 'textDB'
>     +-[WHERE] 'WHERE'
>     |  \-[AND] 'AND'
>     |     +-[AND] 'AND'
>     |     |  +-[AND] 'AND'
>     |     |  |  +-[AND] 'AND'
>     |     |  |  |  +-[EQ] '='
>     |     |  |  |  |  +-[DOT] '.'
>     |     |  |  |  |  |  +-[IDENT] 'conformity'
>     |     |  |  |  |  |  \-[IDENT] 'statusDB'
>     |     |  |  |  |  \-[COLON] ':'
>     |     |  |  |  |     \-[IDENT] 'status'
>     |     |  |  |  \-[EQ] '='
>     |     |  |  |     +-[DOT] '.'
>     |     |  |  |     |  +-[IDENT] 'submittedBy'
>     |     |  |  |     |  \-[IDENT] 'organisation'
>     |     |  |  |     \-[DOT] '.'
>     |     |  |  |        +-[IDENT] 'organisationLevelChecker'
>     |     |  |  |        \-[IDENT] 'organisation'
>     |     |  |  \-[NE] '!='
>     |     |  |     +-[IDENT] 'submittedBy'
>     |     |  |     \-[IDENT] 'organisationLevelChecker'
>     |     |  \-[NOT] 'not'
>     |     |     \-[EXISTS] 'EXISTS'
>     |     |        \-[QUERY] 'query'
>     |     |           +-[SELECT_FROM] 'SELECT_FROM'
>     |     |           |  \-[FROM] 'FROM'
>     |     |           |     \-[RANGE] 'RANGE'
>     |     |           |        +-[DOT] '.'
>     |     |           |        |  +-[DOT] '.'
>     |     |           |        |  |  +-[DOT] '.'
>     |     |           |        |  |  |  +-[DOT] '.'
>     |     |           |        |  |  |  |  +-[IDENT] 'com'
>     |     |           |        |  |  |  |  \-[IDENT] 'joliciel'
>     |     |           |        |  |  |  \-[IDENT] 'aplikaterm'
>     |     |           |        |  |  \-[IDENT] 'domain'
>     |     |           |        |  \-[IDENT] 'ConformityCheckerImpl'
>     |     |           |        \-[ALIAS] 'conformityChecker'
>     |     |           \-[WHERE] 'WHERE'
>     |     |              \-[EQ] '='
>     |     |                 +-[DOT] '.'
>     |     |                 |  +-[DOT] '.'
>     |     |                 |  |  +-[IDENT] 'conformityChecker'
>     |     |                 |  |  \-[IDENT] 'user'
>     |     |                 |  \-[IDENT] 'id'
>     |     |                 \-[DOT] '.'
>     |     |                    +-[IDENT] 'submittedBy'
>     |     |                    \-[IDENT] 'id'
>     |     \-[EQ] '='
>     |        +-[DOT] '.'
>     |        |  +-[IDENT] 'organisationLevelChecker'
>     |        |  \-[IDENT] 'user'
>     |        \-[COLON] ':'
>     |           \-[IDENT] 'pendingCheckBy'
>     \-[ORDER] 'ORDER'
>        \-[DOT] '.'
>           +-[IDENT] 'conformity'
>           \-[IDENT] 'lastUpdateDate'
> --- SQL AST ---
>  \-[SELECT] QueryNode: 'SELECT'  querySpaces (Utilisateur,Controlleur,Conformite,Terme)
>     +-[SELECT_CLAUSE] SelectClause: '{select clause}'
>     |  +-[DOT] DotNode: 'termimpl0_.idTerme' {propertyName=id,dereferenceType=4,propertyPath=id,path=term.id,tableAlias=termimpl0_,className=com.joliciel.aplikaterm.domain.TermImpl,classAlias=term}
>     |  |  +-[ALIAS_REF] IdentNode: 'termimpl0_.idTerme' {alias=term, className=com.joliciel.aplikaterm.domain.TermImpl, tableAlias=termimpl0_}
>     |  |  \-[IDENT] IdentNode: 'id' {originalText=id}
>     |  +-[SELECT_COLUMNS] SqlNode: ' as col_0_0_'
>     |  +-[DOT] DotNode: 'termimpl0_.texte' {propertyName=textDB,dereferenceType=4,propertyPath=textDB,path=term.textDB,tableAlias=termimpl0_,className=com.joliciel.aplikaterm.domain.TermImpl,classAlias=term}
>     |  |  +-[ALIAS_REF] IdentNode: 'termimpl0_.idTerme' {alias=term, className=com.joliciel.aplikaterm.domain.TermImpl, tableAlias=termimpl0_}
>     |  |  \-[IDENT] IdentNode: 'textDB' {originalText=textDB}
>     |  +-[SELECT_COLUMNS] SqlNode: ' as col_1_0_'
>     |  +-[DOT] DotNode: 'conformity1_.dateModification' {propertyName=lastUpdateDate,dereferenceType=4,propertyPath=lastUpdateDate,path=conformity.lastUpdateDate,tableAlias=conformity1_,className=com.joliciel.aplikaterm.domain.ConformityImpl,classAlias=conformity}
>     |  |  +-[ALIAS_REF] IdentNode: 'conformity1_.idConformite' {alias=conformity, className=com.joliciel.aplikaterm.domain.ConformityImpl, tableAlias=conformity1_}
>     |  |  \-[IDENT] IdentNode: 'lastUpdateDate' {originalText=lastUpdateDate}
>     |  +-[SELECT_COLUMNS] SqlNode: ' as col_2_0_'
>     |  +-[DOT] DotNode: 'conformity1_.idTerme_dOrigine' {propertyName=id,dereferenceType=4,propertyPath=sourceTerm.id,path=conformity.sourceTerm.id,tableAlias=conformity1_,className=com.joliciel.aplikaterm.domain.ConformityImpl,classAlias=conformity}
>     |  |  +-[DOT] DotNode: 'conformity1_.idTerme_dOrigine' {propertyName=id,dereferenceType=ROOT_LEVEL,propertyPath=sourceTerm.id,path=conformity.sourceTerm,tableAlias=conformity1_,className=com.joliciel.aplikaterm.domain.ConformityImpl,classAlias=conformity}
>     |  |  |  +-[ALIAS_REF] IdentNode: 'conformity1_.idConformite' {alias=conformity, className=com.joliciel.aplikaterm.domain.ConformityImpl, tableAlias=conformity1_}
>     |  |  |  \-[IDENT] IdentNode: 'sourceTerm' {originalText=sourceTerm}
>     |  |  \-[IDENT] IdentNode: 'id' {originalText=id}
>     |  +-[SELECT_COLUMNS] SqlNode: ' as col_3_0_'
>     |  +-[DOT] DotNode: 'termimpl4_.texte' {propertyName=textDB,dereferenceType=4,propertyPath=textDB,path=conformity.sourceTerm.textDB,tableAlias=termimpl4_,className=com.joliciel.aplikaterm.domain.TermImpl,classAlias=null}
>     |  |  +-[DOT] DotNode: 'conformity1_.idTerme_dOrigine' {propertyName=sourceTerm,dereferenceType=1,propertyPath=sourceTerm,path=conformity.sourceTerm,tableAlias=termimpl4_,className=com.joliciel.aplikaterm.domain.TermImpl,classAlias=null}
>     |  |  |  +-[ALIAS_REF] IdentNode: 'conformity1_.idConformite' {alias=conformity, className=com.joliciel.aplikaterm.domain.ConformityImpl, tableAlias=conformity1_}
>     |  |  |  \-[IDENT] IdentNode: 'sourceTerm' {originalText=sourceTerm}
>     |  |  \-[IDENT] IdentNode: 'textDB' {originalText=textDB}
>     |  \-[SELECT_COLUMNS] SqlNode: ' as col_4_0_'
>     +-[FROM] FromClause: 'FROM' FromClause{level=1, fromElementCounter=5, fromElements=5, fromElementByClassAlias=[conformity, term, submittedBy, organisationLevelChecker], fromElementByTableAlias=[termimpl4_, userimpl2_, conformity1_, termimpl0_, organisati3_], fromElementsByPath=[conformity.sourceTerm, conformity.submittedBy, term.conformityDB], collectionJoinFromElementsByPath=[], impliedElements=[]}
>     |  +-[FROM_FRAGMENT] FromElement: 'Terme termimpl0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=term,role=null,tableName=Terme,tableAlias=termimpl0_,origin=null,colums={,className=com.joliciel.aplikaterm.domain.TermImpl}}
>     |  |  \-[JOIN_FRAGMENT] FromElement: 'inner join Conformite conformity1_ on termimpl0_.idTerme=conformity1_.idTerme' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=conformity,role=com.joliciel.aplikaterm.domain.TermImpl.conformityDB,tableName=Conformite,tableAlias=conformity1_,origin=Terme termimpl0_,colums={termimpl0_.idTerme ,className=com.joliciel.aplikaterm.domain.ConformityImpl}}
>     |  |     +-[JOIN_FRAGMENT] FromElement: 'inner join Utilisateur userimpl2_ on conformity1_.idSoumisPar=userimpl2_.idUtilisateur' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=submittedBy,role=null,tableName=Utilisateur,tableAlias=userimpl2_,origin=inner join Conformite conformity1_ on termimpl0_.idTerme=conformity1_.idTerme,colums={conformity1_.idSoumisPar ,className=com.joliciel.aplikaterm.domain.UserImpl}}
>     |  |     \-[FROM_FRAGMENT] ImpliedFromElement: 'Terme termimpl4_' ImpliedFromElement{implied,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName=Terme,tableAlias=termimpl4_,origin=inner join Conformite conformity1_ on termimpl0_.idTerme=conformity1_.idTerme,colums={conformity1_.idTerme_dOrigine ,className=com.joliciel.aplikaterm.domain.TermImpl}}
>     |  \-[FROM_FRAGMENT] FromElement: 'Controlleur organisati3_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=organisationLevelChecker,role=null,tableName=Controlleur,tableAlias=organisati3_,origin=null,colums={,className=com.joliciel.aplikaterm.domain.OrganisationLevelCheckerImpl}}
>     \-[WHERE] SqlNode: 'WHERE'
>        +-[FILTERS] SqlNode: '{filter conditions}'
>        |  \-[SQL_TOKEN] SqlFragment: 'organisati3_.typeDeControlleur='O''
>        \-[AND] SqlNode: 'AND'
>           +-[AND] SqlNode: 'AND'
>           |  +-[AND] SqlNode: 'AND'
>           |  |  +-[AND] SqlNode: 'AND'
>           |  |  |  +-[EQ] SqlNode: '='
>           |  |  |  |  +-[DOT] DotNode: 'conformity1_.statut' {propertyName=statusDB,dereferenceType=4,propertyPath=statusDB,path=conformity.statusDB,tableAlias=conformity1_,className=com.joliciel.aplikaterm.domain.ConformityImpl,classAlias=conformity}
>           |  |  |  |  |  +-[ALIAS_REF] IdentNode: 'conformity1_.idConformite' {alias=conformity, className=com.joliciel.aplikaterm.domain.ConformityImpl, tableAlias=conformity1_}
>           |  |  |  |  |  \-[IDENT] IdentNode: 'statusDB' {originalText=statusDB}
>           |  |  |  |  \-[NAMED_PARAM] ParameterNode: '?'
>           |  |  |  \-[EQ] SqlNode: '='
>           |  |  |     +-[DOT] DotNode: 'userimpl2_.idOrganisation' {propertyName=organisation,dereferenceType=ROOT_LEVEL,propertyPath=organisation,path=submittedBy.organisation,tableAlias=userimpl2_,className=com.joliciel.aplikaterm.domain.UserImpl,classAlias=submittedBy}
>           |  |  |     |  +-[ALIAS_REF] IdentNode: 'userimpl2_.idUtilisateur' {alias=submittedBy, className=com.joliciel.aplikaterm.domain.UserImpl, tableAlias=userimpl2_}
>           |  |  |     |  \-[IDENT] IdentNode: 'organisation' {originalText=organisation}
>           |  |  |     \-[DOT] DotNode: 'organisati3_.idOrganisation' {propertyName=organisation,dereferenceType=ROOT_LEVEL,propertyPath=organisation,path=organisationLevelChecker.organisation,tableAlias=organisati3_,className=com.joliciel.aplikaterm.domain.OrganisationLevelCheckerImpl,classAlias=organisationLevelChecker}
>           |  |  |        +-[ALIAS_REF] IdentNode: 'organisati3_.idControlleur' {alias=organisationLevelChecker, className=com.joliciel.aplikaterm.domain.OrganisationLevelCheckerImpl, tableAlias=organisati3_}
>           |  |  |        \-[IDENT] IdentNode: 'organisation' {originalText=organisation}
>           |  |  \-[NE] SqlNode: '!='
>           |  |     +-[ALIAS_REF] IdentNode: 'userimpl2_.idUtilisateur' {alias=submittedBy, className=com.joliciel.aplikaterm.domain.UserImpl, tableAlias=userimpl2_}
>           |  |     \-[ALIAS_REF] IdentNode: 'organisati3_.idControlleur' {alias=organisationLevelChecker, className=com.joliciel.aplikaterm.domain.OrganisationLevelCheckerImpl, tableAlias=organisati3_}
>           |  \-[NOT] SqlNode: 'not'
>           |     \-[EXISTS] SqlNode: 'EXISTS'
>           |        \-[SELECT] QueryNode: 'SELECT'  querySpaces (Utilisateur,Controlleur,Conformite,Terme)
>           |           +-[SELECT_CLAUSE] SelectClause: '{derived select clause}'
>           |           |  \-[SELECT_EXPR] SelectExpressionImpl: 'conformity5_.idControlleur' {FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=conformityChecker,role=null,tableName=Controlleur,tableAlias=conformity5_,origin=null,colums={,className=com.joliciel.aplikaterm.domain.ConformityCheckerImpl}}}
>           |           +-[FROM] FromClause: 'FROM' FromClause{level=2, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[conformityChecker], fromElementByTableAlias=[conformity5_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}
>           |           |  \-[FROM_FRAGMENT] FromElement: 'Controlleur conformity5_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=conformityChecker,role=null,tableName=Controlleur,tableAlias=conformity5_,origin=null,colums={,className=com.joliciel.aplikaterm.domain.ConformityCheckerImpl}}
>           |           \-[WHERE] SqlNode: 'WHERE'
>           |              \-[EQ] SqlNode: '='
>           |                 +-[DOT] DotNode: 'conformity5_.idUtilisateur' {propertyName=id,dereferenceType=4,propertyPath=user.id,path=conformityChecker.user.id,tableAlias=conformity5_,className=com.joliciel.aplikaterm.domain.ConformityCheckerImpl,classAlias=conformityChecker}
>           |                 |  +-[DOT] DotNode: 'conformity5_.idUtilisateur' {propertyName=id,dereferenceType=ROOT_LEVEL,propertyPath=user.id,path=conformityChecker.user,tableAlias=conformity5_,className=com.joliciel.aplikaterm.domain.ConformityCheckerImpl,classAlias=conformityChecker}
>           |                 |  |  +-[ALIAS_REF] IdentNode: 'conformity5_.idControlleur' {alias=conformityChecker, className=com.joliciel.aplikaterm.domain.ConformityCheckerImpl, tableAlias=conformity5_}
>           |                 |  |  \-[IDENT] IdentNode: 'user' {originalText=user}
>           |                 |  \-[IDENT] IdentNode: 'id' {originalText=id}
>           |                 \-[DOT] DotNode: 'userimpl2_.idUtilisateur' {propertyName=id,dereferenceType=4,propertyPath=id,path=submittedBy.id,tableAlias=userimpl2_,className=com.joliciel.aplikaterm.domain.UserImpl,classAlias=submittedBy}
>           |                    +-[ALIAS_REF] IdentNode: 'userimpl2_.idUtilisateur' {alias=submittedBy, className=com.joliciel.aplikaterm.domain.UserImpl, tableAlias=userimpl2_}
>           |                    \-[IDENT] IdentNode: 'id' {originalText=id}
>           \-[EQ] SqlNode: '='
>              +-[DOT] DotNode: 'organisati3_.idUtilisateur' {propertyName=user,dereferenceType=ROOT_LEVEL,propertyPath=user,path=organisationLevelChecker.user,tableAlias=organisati3_,className=com.joliciel.aplikaterm.domain.OrganisationLevelCheckerImpl,classAlias=organisationLevelChecker}
>              |  +-[ALIAS_REF] IdentNode: 'organisati3_.idControlleur' {alias=organisationLevelChecker, className=com.joliciel.aplikaterm.domain.OrganisationLevelCheckerImpl, tableAlias=organisati3_}
>              |  \-[IDENT] IdentNode: 'user' {originalText=user}
>              \-[NAMED_PARAM] ParameterNode: '?'

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