【问题标题】:Using subquery in FROM for HQL在 FROM 中为 HQL 使用子查询
【发布时间】:2015-08-07 14:35:20
【问题描述】:

我有以下 SQL 正在做我想做的事(简化):

SELECT tcd.Name, MAX(if(tcd.Name = 'Some Name', tcr.Value, NULL)) as 'Value'
FROM TestCaseData tcd, TestCaseDataResult tcr, PVRTable pvr,
(select MAX(sel.PK) as PK from TestCaseDataResult sel GROUP BY sel.PVR_FK, sel.TCD_FK) selector
WHERE tcr.PK = selector.PK AND tcr.TCD_FK = tcd.PK AND tcr.PVR_PK = pvr.PK
GROUP BY pvr.PK
ORDER BY pvr.PK

需要选择器表,因为该集合可以有多个具有相同sel.PVR_FK, sel.TCD_FK 的记录,在这种情况下MAX(...) 表达式将选择更大的值,但我需要具有更大PK 的值而不是(最后一个值)

我想要 HQL 而不是 SQL。出于显而易见的原因,我试图避免在代码中使用原始 SQL。

看起来 HQL 不支持 FROM 中的子查询。我觉得我可以重写它,这样它就可以在没有子查询但具有自联接的情况下工作,但我正在努力寻找正确的解决方案。

我也很担心性能问题,所以我不想因为效率低而在SELECT中有子查询。

【问题讨论】:

    标签: mysql nhibernate hql


    【解决方案1】:

    我相信你可以试试这个

    SELECT tcd.Name, MAX(if(tcd.Name = 'Some Name', tcr.Value, NULL)) as 'Value')
    FROM TestCaseData tcd, TestCaseDataResult tcr, PVRTable pvr
    WHERE 
        tcr.PK IN(select MAX(PK) from TestCaseDataResult GROUP BY PVR_FK, TCD_FK) 
        AND tcr.TCD_FK = tcd.PK 
        AND tcr.PVR_PK = pvr.PK
    GROUP BY pvr.PK
    ORDER BY pvr.PK
    

    http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-subqueries

    【讨论】:

    • 这种情况下select MAX(tcr.PK) as PK from TestCaseDataResult sel GROUP BY sel.PVR_FK, sel.TCD_FK会被执行N次吗?我试图避免这种情况
    • 答案已更新。没有。它与其他表没有关系,并且在连接上下文中它将是某种静态的。对不起英语
    猜你喜欢
    • 2014-02-12
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多