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 :

Recuperer un seul resultat


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Par défaut Recuperer un seul resultat
    Bonjour,

    J'aimerai votre opinion sur la meilleure facon de ne recuperer qu'un seul enregistrement d'une selection.

    Jusqu'a maintenant je procède comme suit pour recuperer l'enregistrement dont le timestamp est le plus récent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Query alertQuery = hibSession.createQuery("from POJOAlert a where a.DeviceAddress = '"+sessionDeviceAddr+"' order by Timestamp desc");
     
    if(alertQuery.iterate().hasNext()){
          Iterator queryIterator = alertQuery.iterate();
          POJOAlert lastDeviceAlert = (POJOAlert) queryIterator.next();
    }
    ce qui effectivement me retourne le premier enregistrement retourné et du fait du "order by Timestamp desc", l'enregistrement le plus récent.

    Cependant je ne suis pas sur que ce soit la meilleure stratégie. Probablement existe-t-il une manière plus propre et plus performante de procéder.

    Avez-vous une suggestion ?

    Merci pour votre aide !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Par défaut
    recuperes directement ton enregistrement le plus récent en faisant un max sur ta date, puis apres t'as plus qu'a faire un uniqueResult() sur ton resultat

    si t'as des soucis pour la requete ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Par défaut
    Merci pour ta réponse

    Voila j'ai modifié ma requete comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Query alertQuery = hibSession.createQuery("select max(a.Timestamp)  from POJOAlert a where a.DeviceAddress = '"+deviceAddr+"'");
     
    if(alertQuery != null){
     
     POJOAlert lastDeviceAlert = (POJOAlert) alertQuery.uniqueResult();
    }
    Seulement j'obtiens un java.lang.ClassCastException: java.sql.Timestamp

    au niveau de la derniere ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    POJOAlert lastDeviceAlert = (POJOAlert) alertQuery.uniqueResult();
    Je pense que ma requete n'est pas encore parfaite ...
    Ou est mon erreur ?

    MErci pour ton aide

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Par défaut
    Je m'apercois que normalement je devrais utiliser Object[] row = results.next(); comme expliqué ici :

    http://www.hibernate.org/hib_docs/re...-scalarqueries

    et recuperer chaque propriété séparément.

    Seulement ca ne m'arrage pas vraiment de faire comme ca car j'aimerai recuperer un objet POJOAlert entier et non pas des propriétés isolées de cet objet car je passe cet objet POJOAlert a une autre methode juste un peu plus tard dans mon code ...

    Est-ce que ce que je veux faire est possible ou est-ce que je dois en revenir a ma premiere soultion ?

    MErci pour votre aide !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Par défaut
    J'ai essayé la Query suivante en pensant qu'elle ne me retournerait que des unique results mais aparemment ce n'est pas le cas car je recois un

    org.hibernate.NonUniqueResultException: query did not return a unique result: 3


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Query alertQuery = hibSession.createQuery("" +
    "from POJOAlert a where a.DeviceAddress = '"+deviceAddr+"' " +
    "and a.Timestamp =" + "(select max(b.Timestamp) from POJOAlert b where b.DeviceAddress = '"+deviceAddr+"' )"
    );

    Je pense ne pas etre loin de la solution ....

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Par défaut
    Bon mon problème etait que j'avais plusieurs Timestamp egaux pour un meme DeviceAddress et donc le query.uniqueresult me retournait bien la bonne erreur.
    Pour résoudre ce problème en utilisant les Timestamps il me faudrait un niveau de détail du timestamp plus élevé ( de l'ordre de la miliseconde ... ) ce qui me semble ne vient pas en standard dans les des bases de données ...

    J'ai donc décidé de me détourner du timestamp.

    J'ai reussi a magouiller comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    Query alertQuery = hibSession.createQuery("" +
        "from POJOAlert a where a.DeviceAddress = '"+deviceAddr+"' " +
        "and a.Id =" +
        "(select max(b.Id) from POJOAlert b where b.DeviceAddress = '"+deviceAddr+"' )"
    );
     
     POJOAlert lastDeviceAlert = (POJOAlert) alertQuery.uniqueResult();
    Etant donné que la colonne Id est un Integer Auto Increment je recupère bien la derniere alerte stockée en Db ayant le DeviceAddress desiré. Et j'ai donc bien un resultat unique.

    Avant de mettre le tag resolu j'aimerai avoir l'avis des pros du Hibernate sur ce que je viens de faire (question performance etc ... ) afin de savoir si je peux faire mieux ou si j'ai adopté la bonne aproche.

    Merci encore à twif et bien sur au forums de Developpez.com ^^!

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

Discussions similaires

  1. recuperer une seule valeur
    Par leviet94 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/07/2007, 10h07
  2. Réponses: 4
    Dernier message: 24/11/2006, 16h57
  3. eviter un while lorsque un seul resultat
    Par gretch dans le forum Langage
    Réponses: 4
    Dernier message: 20/09/2006, 13h54
  4. Recuperer un seul enrefistrement
    Par ferdossi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/08/2005, 09h42
  5. Syntaxe pour avoir un seul resultat dans une requete
    Par Pompil dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/09/2003, 15h51

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