web-dev-qa-db-fra.com

HQL peut-il sélectionner le jeu de résultats d'une autre requête?

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 ..."

19
Red Bit

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
)
14
Kevin Bowersox

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.

0
shinxg

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

0
João Neves Filho