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