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

JPA Java Discussion :

correction d'une requête (jpa ql)


Sujet :

JPA Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Points : 58
    Points
    58
    Par défaut correction d'une requête (jpa ql)
    bonjour,
    est ce quelqu'un pourra me dire où est l'erreur dans cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Query q=em.createQuery("select sum(o.montant) from Operation o join o.codTransac t join o.codCaisse c where (t.sens='D')and (to_char(c.dateCaisse,'MM/DD/YYYY')=to_char(o.dateOp,'MM/DD/YYYY'))");
    merci

  2. #2
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Points : 58
    Points
    58
    Par défaut
    salut,
    je crois qu'en jpa ql on ne peux pas utiliser 'to_char' ,
    alors comment je peux comparer 2 dates?
    merci

  3. #3
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Tu n'as pas besoin de convertir tes dates.
    Les opérations de comparaisons sont supportées pour les types dates.

  4. #4
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Points : 58
    Points
    58
    Par défaut
    salut,
    en fait j'ai utilisé l'opérateur = et ça n'a pas marché, et c'est pour cette raison que j'ai eu recours à to_char pour essayer,mais il parait que le problème n'est pas lié à la date, voilà ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       sumd = ((Long) em.createQuery("select sum(o.montant)from Operation o join o.codCaisse c  join o.codTransac tt  where (tt.sens='D')and (c.codeCaisse=:cod)and (o.dateOp =c.dateCaisse)")
               .setParameter("cod",code_file()).getSingleResult()).intValue();
    l'exception c'est "java.lang.NullPointerException"
    j'ai essayé plusieurs façon mais ça n'a pas marché,
    est ce que tu as une idée?
    merci

  5. #5
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    NullPointerException ne veut pas dire que ta requête est fausse mais que une de tes références objet sur laquelle tu appeles une méthode est nulle.
    Décompose ta ligne sur plusieurs lignes de code et passe en débugage pour voir qu'est ce qui est null

  6. #6
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Points : 58
    Points
    58
    Par défaut
    bonjour,
    oui tu as raison, voilà je l'ai décomposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public int getSumd() {
                EntityManager em = getEntityManager();
                 if (sumd == -1) {
                try {
                    Query q=em.createQuery("select sum(o.montant) from Operation o join o.codCaisse c  join o.codTransac tt  where (tt.sens='D')and (c.codeCaisse=:cod)and (o.dateOp =c.dateCaisse)")
                            .setParameter("cod",code_file());
                    Long mt=(Long) q.getSingleResult();
    //ligne suivante et celle qui cause l'exception
                    sumd = mt.intValue();
                } finally {
                    em.close();
                }
                 }
            return sumd;
        }
    et le problème est dans la ligne:sumd=mt.intValue();
    mais j'ai besoin de converir le resultat en Integer,car je vais faire des soustractions et des sommations après,aussi je vais le setter dans ma base dans un attribut de type Integer,
    tu as une idée ? merci

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par chflb Voir le message
    bonjour,
    oui tu as raison, voilà je l'ai décomposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public int getSumd() {
                EntityManager em = getEntityManager();
                 if (sumd == -1) {
                try {
                    Query q=em.createQuery("select sum(o.montant) from Operation o join o.codCaisse c  join o.codTransac tt  where (tt.sens='D')and (c.codeCaisse=:cod)and (o.dateOp =c.dateCaisse)")
                            .setParameter("cod",code_file());
                    Long mt=(Long) q.getSingleResult();
    //ligne suivante et celle qui cause l'exception
                    sumd = mt.intValue();
                } finally {
                    em.close();
                }
                 }
            return sumd;
        }
    et le problème est dans la ligne:sumd=mt.intValue();
    mais j'ai besoin de converir le resultat en Integer,car je vais faire des soustractions et des sommations après,aussi je vais le setter dans ma base dans un attribut de type Integer,
    tu as une idée ? merci
    singleResult() renverrait null ?

    curieux… s'il y avait un problème de cast une exception serait levée…
    avec Hibernate soit vous avez un résultat non null soit une exception est levée (NoResultException ou NonUniqueResultException…)

    quel ORM utilisez-vous ?

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Points : 58
    Points
    58
    Par défaut
    salut;
    moi j'utilise Toplink, je crois que tu as raison,le problème est au niveau du getSingleResult(),
    en effet, j'ai remplacé ces deux lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              .setParameter("cod",code_file());
                   Long mt=(Long) q.getSingleResult();
                    sumd = mt.intValue();
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       sumd = (Integer) q.getSingleResult();
    et j'ai eu la même exception du pointeur,

  9. #9
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    Toplink doit avoir le même comportement que Hibernate, c'est celui de la spec : NonUniqueResultatException ou NoResultException

    La fonction sum renvoie soit un Long soit un Double.

    Si tu dis que tu remplaces les deux lignes par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sumd = (Integer) q.getSingleResult();
    et que tu as toujours une NPE, alors c'est que q est null

  10. #10
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Points : 58
    Points
    58
    Par défaut
    salut,
    non getSum() retourne sumd donc renvoie un Integer

    quoi faire?

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par christopheJ Voir le message
    Toplink doit avoir le même comportement que Hibernate, c'est celui de la spec : NonUniqueResultatException ou NoResultException

    La fonction sum renvoie soit un Long soit un Double.

    Si tu dis que tu remplaces les deux lignes par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sumd = (Integer) q.getSingleResult();
    et que tu as toujours une NPE, alors c'est que q est null
    si q était null c'est setParameter qui devrait faire l'exception…

    et donc il devrait avoir d'autres exceptions… lors de la création du query ou du setParameter…

    tout ça n'est pas très cohérent… c'est comme si le code source montré n'était pas celui de la classe compilée…

    exécutez cela en mode debug ou mettez des Log partout…
    et faites un "clean" du projet…

  12. #12
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Points : 58
    Points
    58
    Par défaut
    salut,
    oui c'est q qui est null, merci pour vous 2,c'est un problème de la condition sur les dates dans ma requête, je vais voir,
    merci encore,je le considère résolu,
    bon courage à tous

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

Discussions similaires

  1. Correction d'une requête qui affiche un pourcentage
    Par doudou2015 dans le forum Langage SQL
    Réponses: 23
    Dernier message: 05/06/2015, 02h00
  2. Correction d'une requête
    Par CLion dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/05/2015, 10h35
  3. [MySQL] Requête invalide venant d'une requête SQL correcte
    Par daplayzz dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 22/04/2009, 15h35
  4. Besoin d'une correction sur une requête
    Par Nessie37 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/12/2007, 18h47
  5. [MySQL] Afficher une date correctement après une requête
    Par Nerva dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 12/04/2006, 16h27

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