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.