2014-07-03 14 views
5

Sto provando a scrivere una query HQL per ottenere un elenco di utenti che appartengono a una particolare organizzazione o qualsiasi affiliato da un elenco di affiliati, tuttavia non è possibile analizzare l'ibernazione. esso. Non riesco a capire perché. Ecco l'HQL:nodo AST imprevisto HQL: {vector}

from User u where 
(u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees) 
and u.parentOrganisation.deleted = false 
and u.active = true 

Questo è l'errore che hibernate sputa fuori:

unexpected AST node: {vector} [from com.myapp.User u where (u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees0_, :franchisees 
1_, :franchisees2_) and u.parentOrganisation.deleted = false and u.active = true]. Stacktrace follows: 
Message: unexpected AST node: {vector} [from com.myapp.User u where (u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in :franchisees0_, :fr 
anchisees1_, :franchisees2_) and u.parentOrganisation.deleted = false and u.active = true] 

Se prendo il po or u.parentOrganisation in :franchisees, quindi la mia domanda è simile al seguente:

from User u where 
(u.parentOrganisation = :topLevelOrganisation) 
and u.parentOrganisation.deleted = false 
and u.active = true 

Quindi funziona bene. Cosa c'è di sbagliato nella mia sintassi? Perché l'ibernazione si lamenta di questa clausola in più?

risposta

22

Oh, si scopre che avevo bisogno di racchiudere :franchisees tra parentesi:

from User u where 
(u.parentOrganisation = :topLevelOrganisation or u.parentOrganisation in (:franchisees)) 
and u.parentOrganisation.deleted = false 
and u.active = true 
1

Possiamo dividere condizione "OR" in HQL a 2 dichiarazioni.

Funziona bene.

from User u where 
(u.parentOrganisation = :topLevelOrganisation and u.parentOrganisation.deleted = false 
and u.active = true) 
or (u.parentOrganisation in (:franchisees) and u.parentOrganisation.deleted = false 
and u.active = true)