关于java:HQL可以在另一个查询的结果集上选择吗?

Can HQL Select on the result set of another query?

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

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

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


HQL确实支持子查询,但是它们只能出现在select或where子句中。您提供的示例最好以HQL的直接陈述形式编写。例如:

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

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

For databases that support subselects, Hibernate supports subqueries
within queries. A subquery must be surrounded by parentheses (often by
an SQL aggregate function call). Even correlated subqueries
(subqueries that refer to an alias in the outer query) are allowed.

示例

1
2
3
4
from DomesticCat as cat
where cat.name not in (
    select name.nickName from Name as name
)


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

将过程插入到您的sql中:

1
2
3
4
5
6
7
8
DELIMITER $$
CREATE PROCEDURE `procedure_name`(
  `arg_name` INT,
) BEGIN
     your query here
END;
$$
DELIMITER ;

然后,如果您使用hibernate模式,请从Java代码中调用此过程,如下所示:

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

希望这可以为您提供帮助。


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

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


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

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

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