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.