[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