使用select中的subselect将SQL转换为HQL

时间:2010-04-30 18:26:47

标签: java sql hibernate orm hql

我有以下SQL,我在转换为HQL时遇到问题。 NPE正在被抛出 - 我认为这与SUM函数有关。另外,我想对subselect别名进行排序 - 这可能吗?

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(不工作)

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 个答案:

答案 0 :(得分:11)

如果有兴趣的话,这是工作的HQL:

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

注意ORDER BY col_1_0 _

Hibernate存在一个未解决的问题 - 它无法正确解析别名,并且由于在查询中重命名了别名,因此会引发错误。因此,col_1_0_基本上是一种解决方法 - 这是Hibernate生成的名称。 看问题: http://opensource.atlassian.com/projects/hibernate/browse/HHH-892

相关问题