HQL peut-il sélectionner le jeu de résultats d’une autre requête?
Par exemple:
SELECT COUNT(*) FROM (SELECT * FROM Table)
Je peux le faire en SQL mais quand j'ai essayé comme ci-dessus en HQL mais le message d'erreur de syntaxe "erreur inattendue: (près de la ligne 1, colonne 22 ..."
HQL supporte sous-requêtes , mais ils ne peuvent apparaître que dans la clause select ou where. L’exemple que vous fournissez serait mieux écrit sous forme de déclaration directe dans HQL. Par exemple:
select count(*) from table t (where table is the entity name)
Si la requête implique une instruction plus compliquée que (select * from Table)
, il est recommandé de placer cette logique dans une vue, puis de créer une entité à partir de cette vue.
Hibernate prend en charge les sous-requêtes pour les bases de données qui prennent en charge les sous-requêtes dans les requêtes. Une sous-requête doit être entourée de parenthèses (souvent par Un appel à une fonction d'agrégation SQL). Même sous-requêtes corrélées (les sous-requêtes qui font référence à un alias dans la requête externe) sont autorisées.
Exemple
from DomesticCat as cat
where cat.name not in (
select name.nickName from Name as name
)
il n'y a aucun moyen de faire une sous-requête dans la clause from
dans HQL même si la base de données le supporte, j'ai résolu ce problème en plaçant la requête dans SQL comme un store procedure
, puis appelez la procédure dans HQL. Par exemple:
Insérez la procédure dans votre sql:
DELIMITER $$
CREATE PROCEDURE `procedure_name`(
`arg_name` INT,
) BEGIN
your query here
END;
$$
DELIMITER ;
Ensuite, si vous utilisez la veille prolongée, appelez cette procédure à partir du code Java comme ci-dessous:
Query query = session.createSQLQuery("CALL procedure_name(:arg_name)");
query.setParameter("arg_name", args);
List list = query.list();
J'espère que cela peut vous aider.
Utiliser la sous-requête que vous désirez n'est pas possible. Une façon est d'utiliser un distinct de cette façon:
SELECT COUNT(DISTINCT t.id) FROM table t INNER JOIN t.list l
WHERE t.status = 'ST1' AND l.status = 'ST2'"
J'ai utilisé la jointure interne pour exprimer une répétition choisie