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 :

Question pour une requête sur plusieurs tables/objets


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut Question pour une requête sur plusieurs tables/objets
    Bonjour,

    Voici le schéma de ma base de données :

    Personne <---> Evénement <---> Animateur

    Une personne peut assister à plusieurs événements.
    Un événement est animé par un animateur.


    J'ai faire une requête avec hibernate pour récupérer une liste des Personnes participant à (au moins) un événement animé par l'animateur que je passe en paramètre.

    Mais je ne vois pas du tout comment faire.
    J'arrive à récupérer la liste des Animateurs et à remonter aux personnes, via les événements mais j'aimerais pouvoir faire l'inverse, car dans ce que j'arrive à faire, j'ai des doublons sur les personnes (celles qui assistent à plusieurs événements du même animateur).

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux nous montrer la requete que tu as déjà?

  3. #3
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Ben celle que j'ai pour récupérer, mais dans le mauvais sens, est la suivante :

    From Animateur a Where a.idAnimateur = :idAnim

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from Person p inner join p.evenements e where e.animateur.idAnimateur=:animId
    devrais, il me semble, fonctionner

  5. #5
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Le soucis avec cette requête, c'est que j'ai une exception au cast.
    Ce qui est retourné par la requête ne peut pas être casté en objet Personne ...

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le code?

    Ce qui est retourné, normalement, est un List<Personne>

  7. #7
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Voilà l'exception que j'ai
    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.Personne
    Suite au code exécuté :
    Query qu = session.createQuery("From Personne as p inner join p.evenements e Where e.animateur.idAnimateur=:idAnim");
    personnes = (ArrayList<Personne>)qu.list();

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je crois que ca renvoie des paires Personne,Evenement dans une lsit

    autres à essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select p From Personne p inner join p.evenements e where e.animateur.idAnimateur=:animId
    sinon, jouer peut etre avec les sous query?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select p from Personne p where p.evenement in (select e from Evenement e where e.animateur.idAnimateur=:animId)

  9. #9
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Je vais essayer ça.

    En attendant, je te remercie !
    Et je te tiens au courant si ça fonctionne ou non ...

  10. #10
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    La première fonctionne mais me retourne autant de Personnes que d'événements ...

    C'est justement ce que je voudrais éviter. Je voudrais récupérer un objet Personne qui contient la liste des événements avec l'animateur recherché.

    Peut-être que ce n'est pas possible et qu'il faut effectuer un travail à la main ...


    Quant à la deuxième, elle ne fonctionne pas puisque Personne a un attribute evenements qui est une liste.

    "p.evenement IN ..." ne fonctionne donc pas !

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    rajoute un "group by p" à la fin, ou alors peut etre utilise select unique(p)

  12. #12
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Group By ne me donne pas non plus ce que je voudrais.
    Unique(p) ne fonctionne pas.

    Le soucis, c'est que si un événement est animé par plusieurs animateurs, je récupère tous les animateurs (qui animent l'événement animé entre autres par l'animateur recherché) et pas seulement l'animateur recherché ...

    Pour mes 3 niveaux :
    - Personne
    - Evenement
    - Animateur

    J'aimerais qu'une recherche sur un animateur me retourne une liste de Personne(s), objet qui aurait une liste d'Evenement (qui sont animés par l'animateur recherché) et chaque événement contiendrait une liste d'animateur (qui ne contiendrait que l'animateur recherché).

    Je sais pas trop si je suis clair ...

    En tous cas, je commence à désespérer !

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui c'est clair, c'est faisable avec les requetes hibernate, mais je me gratte la tete pour me rappeler comment

    Dans le temps j'aurais dit

    from Personne p where p.evenement.animateur.animId=:animId

    mais cette notation n'est plus supportée par hibernate (c'était un "bug")

  14. #14
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Si quelqu'un passe par là et a la clé ...

    Parce que là, je sèche complètement.
    Et j'aimerais bien avoir ça rapidement pour pouvoir avancer dans mon projet.

    Merci d'avance.

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select p from Personne p where exist (select e from Evenement e where e.animateur.idAnimateur=:animId and e in elements (p.evenement))
    Eventuellement à corriger. Y a plein de doc sur les requetes avec des collections chez hibernate, au chapitre 11 HQL. Tu devrias jouer avec pour trouver ce qui te conviens le mieux.

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ou alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct p From Personne p, Evenement e where e in elements (p.evenements) and e.animateur.animId=:animId
    devrais aussi passer (je suis plus sur que le "elements" soit nécessaire là)

    quand à celle là, c'est celle qui fonctionnait (avec duplicata) modifiée pour supprimer les doublons, mais je suis pas sur de ses performances

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct p From Personne p inner join p.evenements e where e.animateur.idAnimateur=:animId

  17. #17
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Toujours pas ...

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    bha c'est dans ce gout la, faut bidouiller un peu.

  19. #19
    Membre régulier
    Profil pro
    Dév FrontEnd
    Inscrit en
    Avril 2005
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Dév FrontEnd

    Informations forums :
    Inscription : Avril 2005
    Messages : 239
    Points : 114
    Points
    114
    Par défaut
    Je trouve toujours pas.
    J'ai beau retourner le problème dans tous les sens, je n'y arrive pas.

    Est-ce vraiment possible de faire ça avec Hibernate ?


    Parce que là, quand je regarde les requêtes SQL qu'Hibernate génère, il récupère d'abord les Personnes correspondantes à ma recherche puis fait une autre requête pour récupérer les événements de ces personnes (même les événements qui ne correspondent pas à ma recherche initiale) et constituer la liste d'événements dans l'objet Personne. Et une autre requête est également exécutée pour récupérer les animateurs de chaque événement.

    ...

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    quelles sont les erreurs avec les requetes que je t'ai donnée, qu'a tu essayé d'autre par rapport à la doc? Et surtout, sur quel base de donnée tu t'appuie? Par ce que, normalement, une requet HQL = une requete SQL! Hibernate convertit juste les requetes.

Discussions similaires

  1. Requête sur plusieurs tables/objets
    Par pontus21 dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/04/2009, 14h43
  2. Réponses: 2
    Dernier message: 12/01/2008, 14h57
  3. Aide pour une requête sur deux tables
    Par Andry dans le forum Développement
    Réponses: 2
    Dernier message: 05/11/2007, 07h14
  4. Aide pour une requête sur deux tables
    Par Andry dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/11/2007, 07h14
  5. faire une requête sur plusieurs tables
    Par julien.63 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/08/2006, 22h58

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