2010-01-19 2 views
0

HQL noob ici. Comment réécrire cette requête HQL sans utiliser la clause exists. En SQL, je peux simplement rejoindre la table VisitorProfileField et la table Visitor et ajouter les conditions de l'existant en utilisant un AND.Aide à la réécriture d'une requête HQL (Hibernate Query Language)

Mais en langage HQL, je ne suis pas en mesure de surmonter certaines violations de syntaxe, je suppose. Votre aide est tres apprecie.

"select distinct v from Visitor v where v.id not in (select o.id from Operator o) " + 
     " and exists (select vpf from VisitorProfileField vpf " + 
     " where vpf.visitor = v and vpf.profileField.name = :subscription_field " + 
     " and vpf.numberVal = :type and vpf.stringVal = :manual) " 

Répondre

1

Je ne sais pas si je reçois le sens de votre question, mais je pense que quelque chose comme:

select distinct vpf.visitor 
from VisitorProfileField vpf 
where vpf.profileField.name = :subscription_field 
     and vpf.numberVal = :type and vpf.stringVal = :manual 
     and vpf.visitor.id not in (select o.id from Operator o) 
+0

Le sens va quelque chose comme ceci: sélectionner dans la liste des visiteurs, ces gens qui sont pas les opérateurs, et qui ont souscrit à une liste de diffusion. La clause exists aide à trouver cette dernière partie. Dans votre solution, la table des visiteurs ne s'affiche pas du tout. La requête d'origine souhaite que les personnes hors de la table des visiteurs satisfassent certaines conditions dans la table VisitorProfileField. – jason

+0

J'ai supposé que vpf.visitor m'a donné des visiteurs. En HQL, vous n'avez pas besoin de mentionner explicitement toutes les entités (c'est-à-dire les tables en SQL) pour pouvoir les utiliser, vous pouvez simplement naviguer sur les relations. Donc, quand j'ai 'select distinct vpf.visitor', j'obtiendrai tous les visiteurs via VisitorProfileField qui satisfont les clauses. –

+0

Les opérateurs sont-ils une sous-classe de Visitor? Sinon, le "non" semble dangereux. En HQL vous pouvez également interroger sur la (sous) classe d'un objet. Donc, si Operator est une sous-classe de visiteur, vous pouvez écrire 'vpf.visitor.class! = Operator' –