2010-10-06 7 views
1

Essayer de faire fonctionner la HQL suivante avec NHibernate:NHibernate HQL - select count (*) d'avoir - ne peut pas faire fonctionner

select count(distinct t) as TweetCount 
from Tweet t 
    join t.Tweeter u 
    left join t.Votes v 
    left join t.Tags tag 
where t.App = :app 
having count(distinct v) > 0 

Mais pour une raison quelconque la clause having est ignorée et qu'il compte tous les tweets lorsque seulement 2 tweets ont un vote. Je veux essentiellement compter le nombre de Tweets qui ont au moins un Vote.

Voici ma base de données My Twitter database

J'ai essayé d'ajouter un groupe par ma requête comme ceci:

select count(distinct t) as TweetCount 
from Tweet t 
    join t.Tweeter u 
    left join t.Votes v 
    left join t.Tags tag 
where t.App = :app 
group by t 
having count(distinct v) > 0 

... mais il a fini par retourner une collection contenant 2 entiers chacun à « 1 "au lieu d'un résultat unique.

+1

À quoi pensez-vous que le SQL devrait ressembler? Est-il même possible sans sous-requêtes? (mon instinct me dit que ce n'est pas) –

+0

@Diego Mijelshon: Vous avez raison, j'ai essayé d'écrire l'équivalent T-SQL et cela n'a pas fonctionné non plus, j'ai dû écrire une sous-requête. Va poster ma réponse plus tard aujourd'hui. –

Répondre

3

cela correspond thwe facture

select count(distinct t.Id) as TweetCount 
from Tweet t 
    inner join t.Votes v 
where t.App = :app 

puisque nous sommes intérieure se joindre à la table Votes, tout Tweet qui n'a pas voix ne compteront pas sur le jeu de résultats.

Une autre façon en utilisant pure syntaxe HQL serait

select count(distinct t.Id) as TweetCount 
from Tweet t 
where t.App = :app and size(t.Votes) > 0 

qui va créer une instruction SQL en fonction de votre dialecte, la taille() est spécifique à hql pour les collections, voir 13.8 de la référence NHibernate

Questions connexes