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

Spring Java Discussion :

getHibernateTemplate().find retourne le meme objet plusieurs fois [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Par défaut getHibernateTemplate().find retourne le meme objet plusieurs fois
    bonjour,
    quand je fais un getHibernateTemplate().find(hqlRequest) ça me retourne une liste qui contient le meme objet plusieur fois, je veux dire.
    J'ai une class Toto, avec un mapping sur une table toto et ma requete hql est "from Toto where dateCreation > sysdate-10".
    quand je prends la requete SQL générée par hibernate et je l'excute directement en sql+ ça me retourne une liste de 5 lignes avec les differentes données, par contre la List de getHibernateTemplate().find("from Toto where dateCreation > sysdate-10") me retourne une liste de size 5 (la bonne taille) parcontre c'est le meme objets que je retrouve dans chaque index de la liste, cet objet a les memes données d'une des lignes retournées par la requetes SQL.
    qqn peut m'aider sur ça?
    pour le mapping y'a t'il qqch de sepcial a mettre hormis les mapping attributs java (que des types simples)-> colonne de table?
    Merci,

    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
    public class TotoDAOImpl extends HibernateDaoSupport implements TotoDAO {
    	@SuppressWarnings("unchecked")
    	public List<Toto> getTotosByIdAndDateInterval(int id, Date start, Date end){
    		List<Toto> result = null;
    		Calendar cal = new GregorianCalendar();
    		if (end == null){
    			end = cal.getTime();
    		}
    		if (start == null){
    			cal.add(Calendar.DAY_OF_MONTH, -7);
    			start = cal.getTime();
    		}
    		String endF = Utilities.formatDateTime(end);
    		String startF = Utilities.formatDateTime(start);
     
     
    		String request  = "from Toto where id=" + id + " and start>=to_date('" + startF + "','DD-MM-YY HH24:MI:SS') and stop<=to_date('" + endF + "','DD-MM-YY HH24:MI:SS') order by start desc";
    		//result =getHibernateTemplate().loadAll(Toto.class);
    		result = getHibernateTemplate().find(request);
    		return result;
    	}
    }
    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
    <hibernate-mapping auto-import="true" default-lazy="false"	package="toto.toto">
     
    	<class name="Toto" table="toto">
     
    		<id name="login" type="int">
    			<generator class="native"/>
    		</id>
     
    		<property name="direction" type="string" column="sens"
    			not-null="true"/>
     
    		<property name="error" type="int"
    			column="erreur" not-null="false"/>
     
    		<property name="start" type="timestamp"
    			column="debut" not-null="false"/>
     
    		<property name="stop" type="timestamp"
    			column="fin" not-null="false"/>
     
    		<property name="TransVolume" type="int"
    			column="volume_transmis" not-null="false"/>
     
    		<property name="numberOfTransObject" type="int"
    			column="transmis" not-null="false"/>
     
    	</class>
    </hibernate-mapping>

  2. #2
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Je te conseille de ne pas construire ta requête de cette manière, utilise plutôt quelque chose comme ca (dans un HibernateCallback vu que tu utilises Spring) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    session.createQuery("from Toto t where t.id= :id and t.start >= :dateDebut and t.stop <= :dateFin order by start desc")
        .setInteger("id", id)
        .setDate("dateDebut", start)
        .setDate("dateFin", end)
        .list();
    Pour mieux comprendre ton pb, il serait bon que tu postes la requête générée et les résultats obtenus.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Par défaut
    Bonjour,
    Merci pour la réponse,
    en effet, j'ai essayé le hibernatecallback et bien d'autres! mais ça donne toujours le même resultat! la provisoirement et comme je doit avancer sur le projet, j'ai fait directement une session.createSQLQuery(sqlString) et la ça marche(même si je ne laisserai pas ça comme ça et que je doit faire plus proprement).

    En réponse a ta demande, voici la requete sql générée par hibernate dans la console Eclipse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hibernate: select tototr0_.login as login47_, tototr0_.sens as sens47_, tototr0_.erreur as erreur47_, tototr0_.debut as debut47_, tototr0_.fin as fin47_, tototr0_.volume_transmis as volume6_47_, tototr0_.transmis as transmis47_ from toto tototr0_ where tototr0_.login=7726 and tototr0_.debut>=to_date('19-11-07 00:00:00', 'DD-MM-YY HH24:MI:SS') and tototr0_.fin<=to_date('26-11-07 23:59:59', 'DD-MM-YY HH24:MI:SS') order by tototr0_.debut desc
    le resultat retourné par hibernate est (apres certain formatage-juste NumberFormat-):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    19-11-07 13:22:30  	19-11-07 13:24:07  	S  	81(8,47 MB)
    19-11-07 13:22:30 	19-11-07 13:24:07 	S 	81(8,47 MB)
    19-11-07 13:22:30 	19-11-07 13:24:07 	S 	81(8,47 MB)
    alors que l'execution directe sur sql+ de la meme requete donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    19-11-07 13:22:30  	19-11-07 13:24:07  	S  	81  	8876736
    19-11-07 13:21:53 	19-11-07 13:22:01 	S 	1 	266
    19-11-07 11:44:48 	19-11-07 11:44:57 	S 	1 	266
    Merci pour l'aide

  4. #4
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Je ne comprends pas que tu puisses avoir plusieurs réponses avec une requête qui contient un "where tototr0_.login=7726"
    Le login étant la clé primaire (selon ton mapping), tu ne devrais avoir qu'un seul résultat dans les 2 cas.

    Sinon, si tu as des problèmes de doublons, tu peux les supprimer en passant ta liste dans un HashSet.

  5. #5
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Le champ login est il bien un champ PK en base ? Existe t'il des lignes ayant le même login. Si oui, cela explique le problème. Hibernate va considérer qu'il y a 3 éléments dans la liste à retourner :
    - au moment de traiter la première ligne, il crée un nouvel objet qu'il met dans son cache de premier niveau (cache de la session associé à la transaction),
    - lors du traitement de la seconde ligne, l'id (champ login) est recherché dans le cache :
    -> s'il est déjà présent l'objet précédemment créé est réutilisé,
    -> si la valeur d'id est différente, un nouvel objet est créé et la ligne est traitée correctement.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Par défaut
    Bien vu.
    Effectivement, j'ai une composite-id, pas id tout court.
    j'ai rajouté les autres clefs et ça marche.
    Merci et bravo dlemoing.

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

Discussions similaires

  1. meme opérations plusieurs fois sur un fichier
    Par skouza dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 26/08/2010, 11h29
  2. reception du meme mail plusieurs fois
    Par rihab84 dans le forum Outlook
    Réponses: 1
    Dernier message: 09/09/2009, 20h33
  3. ouverture d'une meme application plusieurs fois
    Par warubi dans le forum VB.NET
    Réponses: 4
    Dernier message: 29/06/2007, 18h50
  4. utiliser la même instance d'un objet plusieurs fois
    Par mhamedbj dans le forum NetBeans
    Réponses: 7
    Dernier message: 08/03/2007, 18h28
  5. interroger un meme champ plusieurs fois
    Par allowen dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2005, 16h26

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