2014-07-03 7 views
5

Ich versuche, eine HQL-Abfrage zu einer Liste von Benutzern, die zu einer bestimmten Organisation oder Franchisenehmer aus einer Liste von Franchisenehmern zu greifen, aber Hibernate ist nicht in der Lage zu analysieren es. Ich kann nicht herausfinden warum. Hier ist die HQL:HQL unerwarteten AST-Knoten: {Vektor}

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

Dies ist der Fehler, die überwintern ausspuckt:

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] 

Wenn ich das or u.parentOrganisation in :franchisees Bit herausnehmen, so dass meine Abfrage sieht wie folgt aus:

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

Dann funktioniert es gut. Was ist falsch an meiner Syntax? Warum beschwert sich der Winterschlaf über diese zusätzliche Klausel?

Antwort

22

Oh, es stellt sich heraus, dass ich :franchisees Element in Klammern benötigt:

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

Wir Zustand aufspalten "OR" in HQL bis 2 Aussagen.

Es funktioniert gut.

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)