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 :

[Hibernate] Quel type de données me retourne ma requête ?


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut [Hibernate] Le résultat de ma requête est changé
    Bonjour à tous !

    J'ai écrit une requête qui doit me retourner une durée.

    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
    16
    17
    18
    19
    20
    21
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    
    sql_query = "SELECT TIMEDIFF(t_soutien.date_res, t_soutien.date_aff)";
    sql_query += " from T_Dem_S t_soutien";
    sql_query += " WHERE t_soutien.etat ='Clôturée'";
    
    Query query = session.createQuery(sql_query);
    
    List data = new ArrayList();
    Time iSig;
    int i = 0;
    
    for (Iterator it = query.iterate(); it.hasNext();) {
    	Object[] row = (Object[]) it.next();
    	iSig = (Time) row[i];
    	data.add(iSig);
    	i++;
    }
    session.close();
    return data;
    Le problème vient lorsque je dois convertir mon résultat pour le sauvegarder (dans une arraylist par exemple).
    Mais une cast exception est levée :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    javax.servlet.ServletException: java.sql.Time
    	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	java.lang.reflect.Method.invoke(Method.java:585)
    	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
    	java.security.AccessController.doPrivileged(Native Method)
    	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
    	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
     
     
    root cause 
     
    java.lang.ClassCastException: java.sql.Time
    	utils.GenerateReportsHG.getIndicateur71E5(Unknown Source)
    	utils.GenerateReportsHG.execute(Unknown Source)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	java.lang.reflect.Method.invoke(Method.java:585)
    	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
    	java.security.AccessController.doPrivileged(Native Method)
    	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
    	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
    Je voudrais savoir comment puis-je récupérer correctement le résultat de ma requête.

    Pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TIMEDIFF(expr,expr2)
     
    TIMEDIFF() retourne la durée entre l'heure de début expr et l'heure de fin expr2. expr et expr2 sont des expressions de type TIME ou DATETIME, et doivent être de même type.
     
    mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');
            -> '-00:00:00.000001'
    mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001','1997-12-30 01:01:01.000002');
            -> '46:58:57.999999'
     
    TIMEDIFF() a été ajoutée en MySQL 4.1.1.

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Quand tu ne connais pas le type d'un objet, "cast" le en Object et affiche obj.getClass().getName() tu verras bien le type de l'objet; que tu pourras ensuite utiliser

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Ok et merci !
    Je viens de caster l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for (Iterator it = query.iterate(); it.hasNext();) {
    		Object monObjet = (Object) it.next();
    		Utils.Syso("Object Name :" + monObjet.getClass().getName());
    		...
    Et je récupère un java.sql.Time !
    Mais comment puis-je faire lorsque la requête me renvoie plusieurs enregistrements ??? C'est un tableau de Times ???

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Ne cherchez plus...
    C'était simple comme bonjour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Iterator it = query.iterate(); it.hasNext();) {
    		row = (Time) it.next();
    		Utils.Syso("time " + i + "_" + row);
    Maintenant, je récupère les résultats !
    Sauf que les résultats ne sont pas les mêmes
    Je m'explique :
    Dans ma requête, timediff entre le 22/06 à 08h46 et le 21/06 à 08h40 doit me renvoyer 24h06min...
    Sauf que le résultat de ma requête me renvoie 00h06min (si j'exécute la même requête directement sur une console, j'ai bien 24h06min).
    Je ne comprends plus...

  5. #5
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Euh bah surement un probleme d'affichage ... sachant que 24h06 = 0h06 + 24h soit un jour complet... il faudrait fouiller dans ce sens je pense

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Je comprends bien que c'est un problème d'affichage...
    Je me tourne vers vous pour savoir comment résoudre ce problème qui me bloque malgrè sa simplicité...

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Quelle est la valeur du long retourné ?

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Je n'arrive pas à convertir mon Time en long...
    Comment puis-je faire ???

  9. #9
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Citation Envoyé par n@n¤u
    Je n'arrive pas à convertir mon Time en long...
    Comment puis-je faire ???
    devrait normalement te retourner la valeur en ms avec une donnée de type long...

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    En effet, java.sql.Time extends java.util.Date donc la méthode est la même

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Le long qui est retourné est : -3240000.
    Il correspond à date1-date2...

    date1 = 22/06 à 08h46 date2 = 21/06 à 08h40

  12. #12
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    J'ai la nette impression que ca n'est pas le bon résultat ... durdur du coup :/

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Pourtant je fais exactement la même requête dans une console MySQL et j'ai bien 24:06:00.
    Qu'est ce qui cloche ???

    Voilà ce que j'ai dans ma console MySQl :
    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
    mysql> SELECT t_soutien.date_res, t_soutien.date_aff, TIMEDIFF(t_soutien.date_res, t_soutien.date_aff)
        -> from t_soutien t_soutien
        -> WHERE t_soutien.etat ='Cl¶turÚe'
        -> AND t_soutien.date_clo >= '2006-06-22'
        -> AND t_soutien.date_clo <= '2006-06-26';
    +---------------------+---------------------+--------------------------------------------------+
    | date_res            | date_aff            | TIMEDIFF(t_soutien.date_res, t_soutien.date_aff) |
    +---------------------+---------------------+--------------------------------------------------+
    | 2006-06-21 10:59:00 | 2006-06-21 08:34:00 | 02:25:00                                         |
    | 2006-06-22 08:46:00 | 2006-06-21 08:40:00 | 24:06:00                                         |
    | 2006-06-23 10:59:00 | 2006-06-21 08:48:00 | 50:11:00                                         |
    | 2006-06-23 10:59:00 | 2006-06-22 15:09:00 | 19:50:00                                         |
    | 2006-06-23 11:00:00 | 2006-06-22 15:17:00 | 19:43:00                                         |
    +---------------------+---------------------+--------------------------------------------------+
    5 rows in set (0.00 sec)
    Et dans ma console JonAs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT TIMEDIFF(t_soutien.date_res, t_soutien.date_aff) from T_Dem_S t_soutien W
    HERE 1=1 AND t_soutien.date_clo >= '2006-06-22' AND t_soutien.date_clo <= '2006-
    06-26'
    02:25:00:LONG_TIME:5100000
    00:06:00:LONG_TIME:-3240000
    02:11:00:LONG_TIME:4260000
    19:50:00:LONG_TIME:67800000
    19:43:00:LONG_TIME:67380000

  14. #14
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    J'ai réussi à contourner le problème sans vraiment comprendre pourquoi le résultat récupéré n'était pas le bon...

    En tout cas, voilà ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT TIME_TO_SEC(TIMEDIFF(t_soutien.date_res, t_soutien.date_aff)) 
    from T_Dem_S t_soutien 
    WHERE 1=1 
    AND t_soutien.date_clo >= '2006-06-22' 
    AND t_soutien.date_clo <= '2006-06-26'
    Et ensuite, je convertis les secondes en HH:MM:SS.
    Si jamais qqun sait pourquoi le résultat précédent n'est pas correct, ça m'aiderait beaucoup.

    Merci à vous d'avoir cherché !

  15. #15
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Je reviens encore vers vous car j'ai toujours le même problème.
    Maintenant, j'utilise cette requête dans Excel et le résultat est le même (il transforme 24:06:00 en 00:06:00)
    Pour l'instant, je transforme le résultat en secondes.
    Ce que je n'arrive pas à faire c'est modifier le résultat pour :
    soit changer de format
    soit transformer les secondes en hh:mm:ss

    De l'aide !!!

  16. #16
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    C'est bon, j'ai finalement opté par faire une procédure stockée qui convertit les secondes en HH:MM:SS....

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

Discussions similaires

  1. Durée en hh:mm:ss : quel type de données
    Par humiside dans le forum Développement
    Réponses: 7
    Dernier message: 08/01/2009, 09h22
  2. quel type de donnée pour un champs de ma table ?
    Par nabians dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/08/2007, 21h33
  3. quel type de donnée choisir pour simuler le type Currency
    Par maamar1979 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/02/2007, 12h44
  4. quel type de donné renvoie un socket
    Par sneb5757 dans le forum Développement
    Réponses: 4
    Dernier message: 18/11/2006, 18h06
  5. Champ PRIX : quel type de donnée ?
    Par Ant8386 dans le forum Oracle
    Réponses: 3
    Dernier message: 28/06/2006, 16h05

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