HQL可以选择在结果集的其它查询?(Can HQL Select on the result set

2019-08-19 04:45发布

HQL可以选择在结果集的其它查询?
例如:

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


我能做到这一点的SQL,但是当我试图像上面的HQL,但它只是告诉我语法错误“意外的标记:(靠近1号线,列22 ......”

Answer 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
)


Answer 2:

使用子查询,你的愿望是不可能的。 一种方法是使用一个不同的是这样的:

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

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



Answer 3:

有没有办法做的子查询from在HQL子句中,即使数据库支持的话,我通过将查询到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();

希望这可以帮到你。



文章来源: Can HQL Select on the result set of another query?