【问题标题】:Can HQL Select on the result set of another query?HQL 可以在另一个查询的结果集上选择吗?
【发布时间】:2013-03-24 19:52:55
【问题描述】:

HQL 可以在另一个查询的结果集上选择吗? 例如:

SELECT COUNT(*) FROM (SELECT * FROM Table)

我可以在 SQL 中执行此操作,但是当我在 HQL 中尝试上述操作时,它只是显示语法错误“意外标记:(第 1 行附近,第 22 列 ...”

【问题讨论】:

  • 我也有同样的问题,请建议您使用的确切解决方案
  • 这种情况下同表最好使用内连接,HQL不能在from子句中添加子查询

标签: java hibernate subquery hql


【解决方案1】:

我最终为我的查询创建了一个视图,然后为此创建了一个模型对象。然后为它创建 HQL 查询就很简单了。

不过,我的应用程序没有其他应用程序可能具备的某些性能要求,因此我可以摆脱它。

【讨论】:

    【解决方案2】:

    即使数据库支持,也无法在HQL中的from子句中进行子查询,我通过将查询作为store procedure放入sql中来解决这个问题,然后在HQL中调用该过程。例如:

    将过程插入到你的 sql 中:

    DELIMITER $$
    CREATE PROCEDURE `procedure_name`(
      `arg_name` INT,
    ) BEGIN
         your query here
    END;
    $$
    DELIMITER ;
    

    然后,如果您使用休眠,请从 java 代码中调用此过程,如下所示:

    Query query = session.createSQLQuery("CALL procedure_name(:arg_name)");
    query.setParameter("arg_name", args);
    List list = query.list();
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      无法根据需要使用子查询。一种方法是使用独特的这种方式:

      SELECT COUNT(DISTINCT t.id) FROM table t INNER JOIN t.list l
           WHERE t.status = 'ST1' AND l.status = 'ST2'"
      

      我使用内连接来表达选择重复

      【讨论】:

        【解决方案4】:

        HQL 确实支持subqueries,但是它们只能出现在 select 或 where 子句中。您提供的示例最好在 HQL 中编写为直接语句。例如:

        select count(*) from table t  (where table is the entity name)
        

        如果查询涉及比(select * from Table) 更复杂的语句,我建议将此逻辑放入视图中,然后根据此视图创建实体。

        对于支持子选择的数据库,Hibernate 支持子查询 在查询中。子查询必须用括号括起来(通常是 SQL 聚合函数调用)。甚至相关的子查询 (在外部查询中引用别名的子查询)是允许的。

        示例

        from DomesticCat as cat
        where cat.name not in (
            select name.nickName from Name as name
        )
        

        【讨论】:

        • 是否有等效的标准?
        • @C_B,检查这个堆栈溢出page
        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多