【问题标题】:HQL comparison inside the select statementselect语句中的HQL比较
【发布时间】:2012-06-15 11:34:09
【问题描述】:

考虑 HQL 中的以下查询:

SELECT m.id, (SELECT (COUNT(*) > 0) FROM SubqueryTable...) FROM MyTable AS m;

我需要从 select 内的 select 查询中以布尔值形式返回信息,其中包含是否有任何条目满足该查询的信息。

上面的查询在 SQL 中可以正常工作,但是休眠给了我一个错误。我不能将比较运算符与聚合函数一起使用。

在 HQL 中,从 select 子句中的 subselect 获取信息的正确方法是什么?

【问题讨论】:

    标签: sql select hql


    【解决方案1】:

    不确定如何将其转换为 HQL,但您的查询可以写成:

    SELECT m.id,
           (SELECT COUNT(*) FROM SubqueryTable...) > 0
             AS b
    FROM MyTable AS m;
    

    但也许你可以使用它——这似乎绕过了问题,因为它使用了INT 列:

    SELECT m.id,
           CASE WHEN (SELECT COUNT(*) FROM SubqueryTable...) > 0
               THEN 1
               ELSE 0
           END AS b
    FROM MyTable AS m;
    

    你也可以试试EXISTS:

    SELECT m.id,
           EXISTS (SELECT * FROM SubqueryTable...) 
             AS b
    FROM MyTable AS m;
    

    或:

    SELECT m.id,
           CASE WHEN EXISTS (SELECT * FROM SubqueryTable...) 
               THEN 1
               ELSE 0
           END AS b
    FROM MyTable AS m;
    

    【讨论】:

    • exists 的查询对我不起作用,但第一个带有 CASE 的查询可以。使用案例的想法让我害怕,但它似乎是它唯一的工作方式。谢谢。
    • 我的猜测是它与布尔值和 BOOLEAN(对于 MySQL 意味着 TINYINT)有关。
    • 或者 MySQL 和 HQL 如何处理(不同)真/假结果/列。
    • 查看我的编辑。我猜查询 2 和 4 有效,而查询 1 和 3 无效?
    • 现在我的问题是我无法通过案例内的选择结果对查询进行排序(在您的示例中,通过变量 b)。我的实现是在 HQL 中,所以我将不得不深入研究如何实现这一点。我在这里找到的解决方案 stackoverflow.com/questions/968438/… 对我来说并不完全正确。
    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 2012-12-23
    • 2019-08-30
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多