java hibernate subquery hql

java - ¿Puede HQL seleccionar en el conjunto de resultados de otra consulta?



hibernate subquery (3)

HQL soporta subqueries , sin embargo, solo pueden ocurrir en la cláusula select o where. El ejemplo que proporcione se escribiría mejor como una declaración directa en HQL. Por ejemplo:

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

Si la consulta implica una declaración más complicada que (select * from Table) , recomendaría poner esta lógica en una vista y luego crear una entidad basada en esta vista.

Para las bases de datos que admiten subselecciones, Hibernate admite subconsultas dentro de las consultas. Una subconsulta debe estar rodeada por paréntesis (a menudo por una llamada de función agregada de SQL). Incluso se permiten subconsultas correlacionadas (subconsultas que hacen referencia a un alias en la consulta externa).

Ejemplo

from DomesticCat as cat where cat.name not in ( select name.nickName from Name as name )

¿Puede HQL seleccionar en el conjunto de resultados de otra consulta?
Por ejemplo:

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


Puedo hacerlo en SQL, pero cuando lo intenté como en HQL, pero simplemente me muestra el error de sintaxis "token inesperado: (cerca de la línea 1, columna 22 ..."


Usar la subconsulta como desees no es posible. Una forma es usar una forma distinta de esta manera:

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

Usé la unión interna para expresar una repetición selecta


no hay forma de realizar una subconsulta en la cláusula from en HQL, incluso si la base de datos lo admite, resolví este problema poniendo la consulta en el SQL como un store procedure , luego llame al procedimiento en HQL. Por ejemplo:

Inserte el procedimiento en su sql:

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

Luego, si usa hibernación, llame a este procedimiento desde el código java como se muestra a continuación:

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

Espero que esto le pueda ayudar.