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

时间:2013-04-03 08:33:03

标签: java hibernate subquery hql

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

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

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

4 个答案:

答案 0 :(得分:15)

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
)

答案 1 :(得分:0)

无法使用子查询。一种方法是使用不同的方式:

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

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

答案 2 :(得分:0)

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

将程序插入sql:

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

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

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

希望这可以帮到你。

答案 3 :(得分:0)

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

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