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 :

Caster l'objet retourner par list.get() sur une requete de jointure


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut Caster l'objet retourner par list.get() sur une requete de jointure
    Bonjour,

    J'ai un soucis pour caster l'objet retourner par un list.get() après une SELECT exécutant une jointure.

    Voici le code exécuté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Query query = session.createQuery("FROM Users u LEFT JOIN u.Usersaddress");
    List result = query.list();
     
    // RETOURNE 3
    System.out.println(result.size());
    // CAST ERROR
    Users u = (Users)result.get(0);
    La liste contient 3 objets, mais je ne sais pas de quel type caster ces objets pour pouvoir les utiliser...

    J'ai utiliser le pluggin synchronizer dans eclipse pour générer mes fichiers de mapping .hbm.xml, qui génère également les fichiers .java relatif.

    Il s'agit d'une relation one-to-many, 1 Users peut avoir N Adress mais, 1 Adress n'a qu'1 seul Users.

    Les fichiers de mapping pour Users et Usersadress ressemble à ca :

    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
    40
    41
    42
    43
    <hibernate-mapping package="org.nasr.database">
    	<class
    		name="Users"
    		table="users">
    		<meta attribute="sync-DAO">false</meta>
    		<id
    			name="Id"
    			type="integer"
    			column="ID_USER"
    		>
    			<generator class="increment"/>
    		</id>
    
    		<set name="Usersaddress" inverse="true">
    			<key column="ID_USER"/>
    			<one-to-many class="Usersaddress"/>
    		</set>	
    	</class>	
    </hibernate-mapping>
    
    
    
    <hibernate-mapping package="org.nasr.database">
    	<class
    		name="Usersaddress"
    		table="usersaddress">
    		<meta attribute="sync-DAO">false</meta>
    		<id
    			name="Id"
    			type="integer"
    			column="ID"
    		>
    			<generator class="increment"/>
    		</id>
    		<many-to-one
    			name="IdUser"
    			column="ID_USER"
    			class="Users"
    			not-null="true"
    		/>
    	</class>	
    </hibernate-mapping>
    Et tant donné qu'il s'agit d'une relation one-to-many je ne veux pas créer une table de jointure externe, ce qui serait complètement illogique bien que suggeré par hibernate, pourquoi créer une table externe, modifier le schéma d'une base de donnée pour faire fonctionner hibernate... ??? dans le cas de relation many-to-many il va de soit mais pas pour une relation one-to-many ou many-to-one.

    Simplement j'aimerai savoir de quel type casté ces objets... merci !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(result.get(0).getClass());

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    Vue que get() renvoie un type Object, si je ne le cast pas et que je demande la classe... ba :

    result.get(0).getClass() -> renvoie Object...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Ce n'est pas parce que la méthode get(int) déclare qu'elle renvoie un Object qu'elle ne renvoie que ça. Elle renvoie un objet qui hérite de Object (donc n'importe quoi).

    Dans ton cas ça m'étonnerait fortement que ça renvoie Object.class...

  5. #5
    Membre averti Avatar de welcome_59
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 203
    Points : 352
    Points
    352
    Par défaut
    Dans son cas result.get(0).getClass() devrait effectivement renvoyer Object, vue la déclaration. 2 possibilités:
    1. Laisser le code tel quel et caster
    2. Utiliser la généricité, et plus besoin de caster
    SCJP 5 | CAPM

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    La méthode getClass() est évaluée à l'execution et pas à la compilation, donc le type de retour déclaré par get() n'a aucune importance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List list = new ArrayList();
    list.add(new Integer(123));
    System.out.println(list.get(0).getClass());
    ce code affiche class java.lang.Integer

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    OK merci pour vos réponses, donc dans l'ordre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Query query = session.createQuery("FROM Users u LEFT JOIN u.Usersaddress");
    List result = query.list();
    System.out.println(result.get(0).getClass());
    Retourne :

    class [Ljava.lang.Object;

    Et si je tente :

    List<Users> result = query.list();

    Forcément la meme erreur qu'au début :

    java.lang.ClassCastException: [Ljava.lang.Object;


    Le problème est de savoir si ces méthodes sont correctes... de quel type caster un objet que retourne une jointure hibernate...



    Merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    class [Ljava.lang.Object;

    Attention au [L : ça veut dire que c'est un tableau d'objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] firstResult = (Object[]) list.get(0);

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    Oh et c'est la toute la beauté de la chose, car c'est une chose que je ne savais pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Query query = session.createQuery("FROM Users u LEFT JOIN u.Usersaddress");
    List result = query.list();
    Object[] obj = (Object[])result.get(0);
    System.out.println(obj[0].getClass());
    Retourne : class Users

    Merci the-gtm, j'espère que ce post aura également servi à d'autre !


  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Est ce que c'est possible de casté un objet dans une requete HQL
    Citation Envoyé par the-gtm Voir le message
    class [Ljava.lang.Object;

    Attention au [L : ça veut dire que c'est un tableau d'objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] firstResult = (Object[]) list.get(0);
    SVP aurriez vous une idée sur cette question : Est ce que c'est possible de casté un objet directement dans une requete HQL

    Merci

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/06/2012, 10h26
  2. aide sur une requete avec jointures
    Par astroseb dans le forum Requêtes
    Réponses: 4
    Dernier message: 18/08/2010, 13h59
  3. [MySQL] souci sur une requete avec jointure
    Par fey dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/09/2008, 11h11
  4. Besoin d'aide sur une requete avec jointure et MAX()
    Par droog dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/07/2007, 18h23
  5. Pb sur une requete avec jointure droite
    Par crashyear dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/02/2007, 08h06

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