22

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

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

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

4

4 回答 4

18

HQL 确实支持子查询,但是它们只能出现在 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
)
于 2013-04-03T08:36:15.293 回答
1

from即使数据库支持,也没有办法在 HQL 子句中进行子查询,我通过将查询作为 a 放入 sql 中解决了这个问题store procedure,然后在 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();

希望这可以帮到你。

于 2018-04-28T23:07:03.430 回答
0

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

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

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

于 2016-06-20T14:51:03.657 回答
0

我最终为我的查询创建了一个视图,然后为此创建了一个模型对象。然后为它创建 HQL 查询是微不足道的。

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

于 2019-09-22T05:12:46.753 回答