utilisation de TopiaQuery
Bonjour, je rencontre un problème avec une TopiaQuery récalcitrante : J'ai la requête SQL suivante : SELECT title, over, runtime, (SELECT COUNT(TOPIAID) FROM EPISODE where SEASON IN (SELECT TOPIAID FROM SEASON WHERE SHOW = S.TOPIAID)) FROM SHOW S ORDER BY title Cette requête passe dans H2 et me donne le résultat escompté. J'essaie de transformer ça en TopiaQuery sans succès. Voici différents codes essayés : TopiaQuery query = showDAO.createQuery("S"); query.addFrom(Episode.class, "E"); query.addFrom(Season.class, "SE"); query.addSelect(Show.TITLE); query.addSelect(Show.OVER); query.addSelect(Show.RUNTIME); String episodeSeasonProperty = TopiaQuery.getProperty(Episode.SEASON); String seasonTopiaIdProperty = TopiaQuery.getProperty(Season.TOPIA_ID); String seasonShowProperty = TopiaQuery.getProperty(Season.SHOW); String showTopiaIdProperty = TopiaQuery.getProperty(Show.TOPIA_ID); String episodeWatchedProperty = TopiaQuery.getProperty(Episode.VIEWED); query.addSelect("(SELECT COUNT(E) where "+episodeWatchedProperty+" AND "+episodeSeasonProperty+" IN (SELECT "+seasonTopiaIdProperty+" WHERE "+seasonShowProperty+" = "+showTopiaIdProperty+"))"); query.addOrder(Show.TITLE); TopiaQuery query = showDAO.createQuery("S"); query.addSelect(Show.TITLE); query.addSelect(Show.OVER); query.addSelect(Show.RUNTIME); query.addSelect("(SELECT COUNT(TOPIAID) FROM EPISODE where SEASON IN (SELECT TOPIAID FROM SEASON WHERE SHOW = S.TOPIAID))"); query.addOrder(Show.TITLE); Quelqu'un aurait une piste pour faire fonctionner tout ça ?
Le Fri, 23 Jul 2010 17:11:31 +0200, Jean Couteau <couteau@codelutin.com> a écrit :
Bonjour,
je rencontre un problème avec une TopiaQuery récalcitrante :
J'ai la requête SQL suivante :
SELECT title, over, runtime, (SELECT COUNT(TOPIAID) FROM EPISODE where SEASON IN (SELECT TOPIAID FROM SEASON WHERE SHOW = S.TOPIAID)) FROM SHOW S ORDER BY title
Ta requete semble bien compliqué. Que veut tu faire exactement ? Quels sont les relations entre SHOW, EPISODE et SEASON ? Je verrais plus quelque chose comme (en HQL) : Ici je suppose Episode --> 1 Season --> 1 Show SELECT S.title, S.over, S.runtime, COUNT(*) FROM Episode E LEFT JOIN E.season SE LEFT JOIN SE.show S GROUP BY S.title, S.over, S.runtime ORDER BY S.title; En présumant que l'épisode connait sa saison et que la saison connait son "show". Sinon il te faudrait identifier précisemment toutes les propriétés avec des alias dans ta requête, car des topiaId il y en a dans toute les tables, il est difficile de bien lire cette requête. Note : tu devrais donner ton erreur la prochaine fois ainsi que le HQL généré par la TopiaQuery (affiche la simplement dans un log). -- Florian Desbois <fdesbois@codelutin.com> SSLL Code Lutin http://www.codelutin.com tel : 02 40 50 29 28 Réseau Libre-Entreprise
Le 25/07/2010 23:57, fdesbois a écrit :
Le Fri, 23 Jul 2010 17:11:31 +0200, Jean Couteau<couteau@codelutin.com> a écrit :
Bonjour,
je rencontre un problème avec une TopiaQuery récalcitrante :
J'ai la requête SQL suivante :
SELECT title, over, runtime, (SELECT COUNT(TOPIAID) FROM EPISODE where SEASON IN (SELECT TOPIAID FROM SEASON WHERE SHOW = S.TOPIAID)) FROM SHOW S ORDER BY title
Ta requete semble bien compliqué. Que veut tu faire exactement ? Quels sont les relations entre SHOW, EPISODE et SEASON ?
Je verrais plus quelque chose comme (en HQL) :
Ici je suppose Episode --> 1 Season --> 1 Show
SELECT S.title, S.over, S.runtime, COUNT(*) FROM Episode E LEFT JOIN E.season SE LEFT JOIN SE.show S GROUP BY S.title, S.over, S.runtime ORDER BY S.title;
En présumant que l'épisode connait sa saison et que la saison connait son "show".
Sinon il te faudrait identifier précisemment toutes les propriétés avec des alias dans ta requête, car des topiaId il y en a dans toute les tables, il est difficile de bien lire cette requête.
Note : tu devrais donner ton erreur la prochaine fois ainsi que le HQL généré par la TopiaQuery (affiche la simplement dans un log).
Well done Flo, t'as tout capté direct. En fait, je connais pas du tout les join du coup j'utilises pas et je contournes. Ma requête passait bien en SQL, mais du coup en l'adaptant en HQL c'était plus bon, la tienne si (enfin presque ;) ). Pour info en TopiaQuery ça donne (adapté) : TopiaQuery query = episodeDAO.createQuery("E"); query.setSelect("S."+Show.TITLE, "S."+Show.OVER, "S."+Show.RUNTIME, "COUNT(*)", "S."+Show.RUNTIME+"*COUNT(*)"); query.addLeftJoin("E.season", "SE", false); query.addLeftJoin("SE.show", "S", false); query.addEquals("E."+Episode.VIEWED, true); query.addGroup("S."+Show.TITLE, "S."+Show.OVER, "S."+Show.RUNTIME); query.addOrder("S."+Show.TITLE); Va falloir que je me penches un peu plus sur les join moi même si comme ça j'ai vu un peu comment m'en servir. Enfin bref, merci Flo et Julien.
Le Mon, 09 Aug 2010 14:16:47 +0200, Jean Couteau <couteau@codelutin.com> a écrit :
Well done Flo, t'as tout capté direct. En fait, je connais pas du tout les join du coup j'utilises pas et je contournes. Ma requête passait bien en SQL, mais du coup en l'adaptant en HQL c'était plus bon, la tienne si (enfin presque ;) ). Pour info en TopiaQuery ça donne (adapté) :
TopiaQuery query = episodeDAO.createQuery("E"); query.setSelect("S."+Show.TITLE, "S."+Show.OVER, "S."+Show.RUNTIME, "COUNT(*)", "S."+Show.RUNTIME+"*COUNT(*)"); query.addLeftJoin("E.season", "SE", false); query.addLeftJoin("SE.show", "S", false); query.addEquals("E."+Episode.VIEWED, true); query.addGroup("S."+Show.TITLE, "S."+Show.OVER, "S."+Show.RUNTIME); query.addOrder("S."+Show.TITLE);
Va falloir que je me penches un peu plus sur les join moi même si comme ça j'ai vu un peu comment m'en servir.
Dans ton cas tu peux même t'en passer, enfin si tu as bien une seule saison pour un épisode et un seul show pour une saison : String episodeAlias = "E"; // La méthode getProperty te fait simplement une concatenation des // parametres en les séparant par un '.' c'est comme si j'avais mis // "E.season" String seasonProperty = TopiaQuery.getProperty(episodeAlias, Episode.SEASON); String showProperty = TopiaQuery.getProperty(seasonProperty, Season.SHOW); maintenant tu peux utiliser ces variables au lieu des alias et des jointures, ex : query.addGroup(showProperty + Show.TITLE, showProperty + Show.OVER, showProperty + Show.RUNTIME)... cela va te donner en HQL : GROUP BY E.season.show.title, E.season.show.over, E.season.show.runtime. Attention cette astuce ne marche pas si season ou show sont des collection, dans ce cas les jointures sont indispensables.
Enfin bref, merci Flo et Julien.
Enjoy ;)
_______________________________________________ Topia-users mailing list Topia-users@list.nuiton.org http://list.nuiton.org/cgi-bin/mailman/listinfo/topia-users
-- Florian Desbois <fdesbois@codelutin.com> SSLL Code Lutin http://www.codelutin.com tel : 02 40 50 29 28 Réseau Libre-Entreprise
participants (2)
-
fdesbois -
Jean Couteau