107 votes

Comment créer une requête Distinct dans HQL

Est-il possible de créer une requête Distinct dans HQL? Soit en utilisant le mot clé "distinct" ou une autre méthode. Je ne sais pas si distinct est un travail de clé valide pour HQL, mais je cherche l’équivalent HQL du mot clé SQL "distinct".

132voto

Feet Points 1544

Voici un extrait de HQL que nous utilisons. (Les noms ont été changés pour protéger les identités)

 String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
        return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});
 

61voto

Daniel Alexiuc Points 2304

Il est intéressant de noter que le "distinct" mot-clé dans les requêtes HQL ne correspondent pas directement à la "distinct" mot-clé dans SQL.

Si vous utilisez le "distinct" mot-clé dans les requêtes HQL, alors, parfois, Hibernate utilisera distinctement le mot clé SQL, mais dans certaines situations, il utilisera un résultat transformateur pour produire des résultats distincts. Par exemple, lorsque vous utilisez une jointure externe comme ceci:

select distinct o from Order o left join fetch o.lineItems

Il n'est pas possible de filtrer les doublons au niveau SQL dans ce cas, Hibernate utilise resultTransformer pour filtrer les doublons APRÈS la requête SQL a été exécutée.

16voto

Michael Points 51

faire quelque chose comme ça la prochaine fois

  Criteria crit = (Criteria) session.
                  createCriteria(SomeClass.class).
                  setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

 List claz = crit.list();
 

4voto

Tadeusz Kopec Points 7625

J'ai eu quelques problèmes avec les transformateurs de résultats combinés avec des requêtes HQL. Quand j'ai essayé

 final ResultTransformer trans = new DistinctRootEntityResultTransformer();
qry.setResultTransformer(trans);
 

ça n'a pas marché. Je devais transformer manuellement comme ça:

 final List found = trans.transformList(qry.list());
 

Avec les critères de l'API Criteria, les transformateurs fonctionnaient parfaitement.

1voto

San Lin Naing Points 1

J'ai eu une réponse pour Hibernate Query Language à utiliser domaines Distincts. Vous pouvez utiliser *SELECT DISTINCT(TO_CITY) à PARTIR de FLIGHT_ROUTE*. Si vous utilisez SQL de la requête, il retourne la Chaîne de la Liste. Vous ne pouvez pas utiliser la valeur de retour par Classe d'Entité. Donc la Réponse pour résoudre ce type de Problème est d'utiliser les requêtes HQL avec SQL.

FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY);

À partir de SQL instruction de la requête qu'il a obtenu DISTINCTES ROUTE_ID et entrée sous forme de Liste. Et DANS le filtre de requête distinctes TO_CITY de (Liste).

Le type de retour est une Entité du type de grain. Si vous le pouvez, il en AJAX comme AutoComplement.

Peuvent tous être OK

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X