IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Ok sous SQL, pas ok sous Hibernate


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Ok sous SQL, pas ok sous Hibernate
    Bonjour,

    pour mon application, j'ai bati une requête en SQL pur à la main, puisque je voulais la tester avant de mettre ca sous Hibernate et je suis plus à l'aise de travailler avec du SQL qu'avec Hibernate. Le point est, ma requête fonctionne à merveille mon serveur SQL, mais elle plante allégrement sous Hibernate...donnant ceci dans le stack trace:

    [java] Exception in thread "main" net.sf.hibernate.QueryException: outer or full join must be followed by path expression [SELECT count(*) FROM com.mx.releasemgr.domain.Task tk JOIN com.mx.releasemgr.domain.ProjectChange pc ON tk.projectChangeId=pc.projectChangeId WHERE pc.number='relmgr']
    [java] at net.sf.hibernate.hql.FromParser.token(FromParser.java:166)
    [java] at net.sf.hibernate.hql.ClauseParser.token(ClauseParser.java:87)
    [java] at net.sf.hibernate.hql.PreprocessingParser.token(PreprocessingParser.java:123)
    [java] at net.sf.hibernate.hql.ParserHelper.parse(ParserHelper.java:29)
    [java] at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:149)
    [java] at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:138)
    [java] at net.sf.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:293)
    [java] at net.sf.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:1530)
    [java] at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1501)
    [java] at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1491)
    [java] at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1483)
    [java] at com.mx.releasemgr.bootstrap.UpdateDataSynchronization.main(UpdateDataSynchronization.java:307)
    [java] Java Result: 1


    Ma requete sous SQL:
    SELECT count(*) FROM task tk JOIN project_change pc ON tk.project_change_id=pc.project_change_id WHERE pc.number='relmgr'
    Ma requete sous Hibernate:
    String query = "SELECT count(*) FROM com.mx.releasemgr.domain.Task tk JOIN com.mx.releasemgr.domain.ProjectChange pc ON tk.projectChangeId=pc.projectChangeId WHERE pc.number='relmgr'";

    System.out.println(query);
    int count = ((Integer) session.find(query).get(0)).intValue();
    La requête est identique la, juste la synthaxe qui change... je dois faire une faute dans la synthaxe...surement autour du "JOIN" je crois...

    Merci de m'aider

    Si le besoin est, je peux mettre la définition de mes tables, mais je ne crois pas que ce soit nécéssaire...

    ++

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 74
    Points : 90
    Points
    90
    Par défaut
    Et si tu essayais comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String query = "SELECT count(*)  FROM com.mx.releasemgr.domain.Task tk,
     com.mx.releasemgr.domain.ProjectChange pc 
    WHERE tk.projectChangeId=pc.projectChangeId AND pc.number='relmgr'";
     
    System.out.println(query);
    int count = ((Integer) session.find(query).get(0)).intValue();

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai tempté, ca ne fonctionne pas plus... encore la, j'ai mit son équivalent sous SQL soit:

    SELECT count(*) FROM task tk, project_change pc WHERE tk.project_change_id=pc.project_change_id AND pc.number='relmgr'
    ce qui donne bel et bien la même réponse, enfin, retourne la même valeur ! Donc sous SQL, ca marche...

    Par contre, avec Hibernate, dans le stack trace, je recois:

    [java] Exception in thread "main" net.sf.hibernate.QueryException: could not resolve property: projectChangeId of: com.mx.releasemgr.domain.ProjectChange [SELECT count(*) FROM com.mx.releasemgr.d
    omain.Task tk, com.mx.releasemgr.domain.ProjectChange pc WHERE tk.projectChangeId=pc.projectChangeId AND pc.number='relmgr']
    [java] at net.sf.hibernate.persister.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
    [java] at net.sf.hibernate.hql.PathExpressionParser.getPropertyType(PathExpressionParser.java:244)
    [java] at net.sf.hibernate.hql.PathExpressionParser.end(PathExpressionParser.java:283)
    [java] at net.sf.hibernate.hql.WhereParser.doPathExpression(WhereParser.java:336)
    [java] at net.sf.hibernate.hql.WhereParser.doToken(WhereParser.java:366)
    [java] at net.sf.hibernate.hql.WhereParser.token(WhereParser.java:251)
    [java] at net.sf.hibernate.hql.ClauseParser.token(ClauseParser.java:87)
    [java] at net.sf.hibernate.hql.PreprocessingParser.token(PreprocessingParser.java:123)
    [java] at net.sf.hibernate.hql.ParserHelper.parse(ParserHelper.java:29)
    [java] at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:149)
    [java] at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:138)
    [java] at net.sf.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:293)
    [java] at net.sf.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:1530)
    [java] at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1501)
    [java] at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1491)
    [java] at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1483)
    [java] at com.mx.releasemgr.bootstrap.UpdateDataSynchronization.main(UpdateDataSynchronization.java:309)

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 74
    Points : 90
    Points
    90
    Par défaut
    Bon la apparemment, il signale un probleme avec projectChangeId
    Est-ce que tu l'a bien appelee ainsi ton champ ? Dans ton fichier de mapping, il correspond bien a une colonne de ta BDD, sinon balance les sources

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Écoute, ca fait 2 ans que les fichiers de mappings ont pas changé, et les ProjectChange sont les objets que j'utilise le plus alors le problème ne vient clairement pas de la...J'utilise ce getter la tous les jours alors...

    Je vais continuer de fouiller alors...Mais je suis pas mal sur que c'est dans ma facon d'utiliser le JOIN dans hibernate qui passe pas =/

    Si ca t'amuse tant d'avoir mon fichier xml de mapping, je peux te le donner, mais bon, useless...

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 74
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par Kzeon
    Si ca t'amuse tant d'avoir mon fichier xml de mapping, je peux te le donner, mais bon, useless...
    Non ça ne m'amuses pas, mais pour donner un coup et comprendre au mieux ce qui se passe, ça peut toujours, apres si tu dis que ca fait deux ans que ca marche comme ca, No comment !

    tu peux toujours essayer de voir la requete sql genere par hibernate pour la comparer avec la tienne

    tu rajoutes la ligne suivante dans ton fichier cfg.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <property name="hibernate.show_sql">true</property>

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon,

    dans le stack trace j'obtiens:

    SELECT count(*) FROM com.mx.releasemgr.domain.Task tk, com.mx.releasemgr.domain.ProjectChange pc WHERE tk.projectChangeId=pc.projectChangeId AND pc.number='relmgr'
    Si je change les noms pour les bons, ca me donne ca:

    SELECT count(*) FROM task tk, project_change pc WHERE tk.project_change_id=pc.project_change_id AND pc.number='relmgr'
    et ca cay exactement la même chose que ma requête SQL qui est fonctionnelle. Donc cay Hibernate qui fait le con la...

    Edit: Putain de merde...

    Cay un gars avec qui je bosse qui a changer le fichier de mapping sans m'en parler. Ah je suis pas heureux la...

    Bon, cela est a moitié de ma faute... ca m'enrage =(

    Cette idée aussi de ne pas utiliser le meme nom de getter que le nom de la colonne...

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 74
    Points : 90
    Points
    90
    Par défaut
    tiens pour une fois j'avais raison de reclamer le fichier de mapping, comme quoi ...


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2015, 14h39
  2. Réponses: 1
    Dernier message: 05/11/2014, 17h00
  3. [SQL] Requête sql qui plante sous firefox et marche sous IE
    Par PlayKat dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/10/2007, 16h17
  4. Réponses: 2
    Dernier message: 06/06/2005, 15h13
  5. Réponses: 2
    Dernier message: 04/06/2004, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo