HQL 能否在另一个查询的结果集上进行选择?

2022-09-02 01:45:31

HQL 能否在另一个查询的结果集上进行选择?例如:

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

我可以在SQL中执行此操作,但是当我在HQL中像上面一样尝试时,它只是向我显示语法错误“意外的令牌:(靠近第1行,列22...”)


答案 1

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
)

答案 2

即使数据库支持,也没有办法在HQL中的子句中执行子查询,我通过将查询作为sql放入sql中来解决此问题,然后在HQL中调用该过程。例如:fromstore procedure

将该过程插入到 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();

希望这可以帮助你。


推荐