Hibernate Books

All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: Join pour 3 Tables.
PostPosted: Fri Aug 20, 2010 8:49 am 
Newbie

Joined: Fri Aug 20, 2010 7:31 am
Posts: 1
Bonjour,

Je suis nouveau dans le forum et j'ai cherché une info dont j'ai besoin, mais j'ai pas trouvé ou sinon elle était pas trés claire pour moi. En fait, j'ai 3 classes qui representent 3 tables dans ma Bases de Données. La table Visite avec son id, la table Visiteurs, avec l'info du Visiteur plus la reference de clé étrangère sur Visite, et ResponsableVisite avec l'info du responsable plus la clé étrangère sur Visite. Alors j'ai un truc comme ça

--------------- --------------- ---------------
VISITEUR - -VISITE - -RESPONSABLE
idVisite -<--------id PK ----------->-idVisite
nom PK - -date - -nom PK
--------------- --------------- ---------------

J'utilise la fonction de reverse engineering de Eclipse pour generer mes classes avec les annotations en Java. Les classes sont les suivantes:

Classe Visite
Code:
@Entity
@Table(name = "VISITE", schema = "REBUTS")
public class Visite implements java.io.Serializable {

   private int id;
   private Date dateDebut;
   private Set<Visiteur> visiteurs = new HashSet<Visiteur>(0);
   private Set<ResponsableVisite> responsableVisites = new HashSet<ResponsableVisite>(0);

   public Visite(int id) {
      this.id = id;
   }

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
   @SequenceGenerator(name = "G1", sequenceName = "VISITE_SEQ")
   @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
   public int getId() {
      return this.id;
   }
   public void setId(int id) {
      this.id = id;
   }

   @Temporal(TemporalType.DATE)
   @Column(name = "DATE_DEBUT", length = 7)
   public Date getDateDebut() {
      return this.dateDebut;
   }
   public void setDateDebut(Date dateDebut) {
      this.dateDebut = dateDebut;
   }

   @OneToMany(fetch = FetchType.LAZY, mappedBy = "visite")
   public Set<Visiteur> getVisiteurs() {
      return this.visiteurs;
   }
   public void setVisiteurs(Set<Visiteur> visiteurs) {
      this.visiteurs = visiteurs;
   }

   @OneToMany(fetch = FetchType.LAZY, mappedBy = "visite")
   public Set<ResponsableVisite> getResponsableVisites() {
      return this.responsableVisites;
   }
   public void setResponsableVisites(Set<ResponsableVisite> responsableVisites) {
      this.responsableVisites = responsableVisites;
   }
}


Classe Visiteur
Code:
@Entity
@Table(name = "VISITEUR", schema = "REBUTS")
public class Visiteur implements java.io.Serializable {

   private Visite visite;
   private String nom;

   public Visiteur() {
   }

   @Id
   @Column(name = "NOM", length = 50, unique = true, nullable = false)
   public String getNom() {
      return this.nom;
   }
   public void setNom(String nom) {
      this.nom = nom;
   }
   
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "ID_VISITE")
   public Visite getVisite() {
      return this.visite;
   }
   public void setVisite(Visite visite) {
      this.visite = visite;
   }
}


Et la classe ResponsableVisite
Code:
@Entity
@Table(name = "RESPONSABLE_VISITE", schema = "REBUTS")
public class ResponsableVisite implements java.io.Serializable {

   private Visite visite;
   private String nom;

   public ResponsableVisite() {
   }

   @Id
   @Column(name = "NOM", length = 50, unique = true, nullable = false)
   public String getNom() {
      return this.nom;
   }
   public void setNom(String nom) {
      this.nom = nom;
   }

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "ID_VISITE")
   public Visite getVisite() {
      return this.visite;
   }
   public void setVisite(Visite visite) {
      this.visite = visite;
   }
}


J'ai laissé le fetch mode en Lazy car je veux pas charger tous les données des autres tables lors d'un simple requete. Mais maintenant j'ai besoin de charger une visite avec ses objets relationnés. J'ai faire le HQL suivant:

Code:
SELECT v FROM Visite v
LEFT JOIN FETCH v.visiteurs visiteurs
LEFT JOIN FETCH v.responsableVisites responsables
WHERE v.dateDebut >= :begin
ORDER BY v.dateDebut


Elle marche, mais j'ai des resultats repetés. ce sont mes données:

Table Visite
1 20/08/10
2 20/08/10
8 19/08/10

Table Visiteur
1 33
2 999
2 899
8 Claude Olinger
8 Jéémie Pieri

Table Responsable
1 11
2 33
2 55
8 J. BLUM
8 M.GAMBADE

Quand je faire l'iteration sur les resultats, j'ai pas 3 objest Visite mais 9. Qu'est-ce qui me manque dans mon HQL. Je voudrais pas utiliser un DISTINCT. Merci.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.