2010-04-30 3 views
6

Ich habe die folgende SQL, die ich Probleme beim Konvertieren in HQL haben. Eine NPE wird geworfen - was ich denke, hat etwas mit der Funktion SUMME zu tun. Außerdem möchte ich den Subselect-Alias ​​sortieren - ist das möglich?Konvertieren von SQL mit Subselect in wählen zu HQL

SQL (subselect):

SELECT q.title, q.author_id, 
    (SELECT IFNULL(SUM(IF(vote_up=true,1,-1)), 0) 
    FROM vote WHERE question_id = q.id) AS votecount 
FROM question q ORDER BY votecount DESC 

HQL (nicht funktioniert)

SELECT q, 
    (SELECT COALESCE(SUM(IF(v.voteUp=true,1,-1)), 0) 
    FROM Vote v WHERE v.question = q) AS votecount 
    FROM Question AS q 
    LEFT JOIN q.author u 
    LEFT JOIN u.blockedUsers ub 
    WHERE q.dateCreated BETWEEN :week AND :now 
    AND u.id NOT IN (
     SELECT ub.blocked FROM UserBlock AS ub WHERE ub.blocker = :loggedInUser 
    ) 
    AND (u.blockedUsers IS EMPTY OR ub.blocked != :loggedInUser) 
    ORDER BY votecount DESC 
+1

nur aus Neugier: Warum möchten Sie eine knappe SQL-Abfrage in einer so komplexen und komplizierten HQI-Abfrage übersetzen? – bertolami

+0

könnten Sie mir mit dieser http://stackoverflow.com/questions/23303315/hql-query-sum-of-two-sub-select helfen –

Antwort

10

Hier ist die Arbeits HQL wenn jemand interessiert:

SELECT q, 
(SELECT COALESCE(SUM(CASE v.voteUp WHEN true THEN 1 ELSE -1 END), 0) 
FROM Vote v WHERE v.question = q) AS votecount 
FROM Question AS q 
LEFT JOIN q.author u 
LEFT JOIN u.blockedUsers ub 
WHERE q.dateCreated BETWEEN :week AND :now 
AND u.id NOT IN (
    SELECT ub.blocked FROM UserBlock AS ub WHERE ub.blocker =:loggedInUser 
) 
AND (u.blockedUsers IS EMPTY OR ub.blocked !=:loggedInUser) 
ORDER BY col_1_0_ DESC 

Beachten Sie die ORDER BY col_1_0_

Es gibt ein offenes Problem mit Hibernate - Aliase werden nicht korrekt analysiert, und da die Aliase in der Abfrage umbenannt werden, wird ein Fehler ausgelöst. Col_1_0_ ist also im Grunde ein Workaround - das ist der Name, den Hibernate generiert. Siehe Ausgabe: http://opensource.atlassian.com/projects/hibernate/browse/HHH-892