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 :

Requête SQL de jointure Hibernate


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut Requête SQL de jointure Hibernate
    Bonjour,

    J'ai actuellement une requête hql toute simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		listTable1 = (List<Table1>) entityManagerFactory.createQuery("FROM Table1", Table1.class).getResultList();
    Maintenant, j'ai une table 2 avec une clé étrangère qui est la clé primaire de la table 1.
    Je voudrais, quand je récupère les informations de la table1, que cela me récupère également la table2. Par exemple, pour la première clé primaire de la table1, je peux avoir 15 enregistrement dans la table 2.
    En gros, je pense qu'il me faut un attribut List<Table2> table2 dans la classe de la Table1.
    Comment faire au niveau requête?

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Si tu as bien configuré le mapping des deux classes, tu peux faire comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Object[]> listTable1_2 = entityManagerFactory.createQuery("select t1,t2 FROM Table1 t1 join t1.table2 t2").getResultList();
    Pour la jointure, à toi de voir s'il s'agit d'un inner join ou left join.
    Ce que tu faits n'est pas du sql mais du jpql (JPA).

    En jqpl, il y a aussi le clause fetch pour la jointure qui te permet de charger directement les deux tables sans que d'autre requête sera exécuté lors de la lecture de l'attribut lié à la seconde table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listTable1 = (List<Table1>) entityManagerFactory.createQuery("FROM Table1 t1 join fetch t1.t2", Table1.class).getResultList();
    Dans ce cas, quand tu parcours la liste listTable1, tu peux directement avoir t2 sans qu'une requête à la base se fasse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Table1 t1 : listTable1){
    Set<Table2> t2 = t1.getT2(); // Set ou List ou Collection, dépendant de ton mapping.
    }
    Tout cela n'est valable que si tu as bien configuré tes mapping.

    Utilise un nom de variable qui correspond au type de l'objet. entityManagerFactory doit être un EntityManager donc entityManager doit être plus approprié. Sinon ça donne confusion.

    A+.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Justement, je pense que cela pêche au niveau de la configuration des mappings
    Il me balance cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'null.TAble1' [FROM Table1 JOIN FETCH Table2.Table1]
    Structure de ma table 1:
    id nom
    1 nom1
    2 nom2

    Structure de ma table 2:
    id champ idTable1
    1 champ1 1
    2 champ2 1
    3 champ3 1
    ...

    Donc quand je récupère ma table1 faut que sa récupère ma table2.
    Par exemple, pour l'id1 de la table1, je doit récupérer aussi les 3 lignes de la table2

    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
    @Entity
    @Table(name = "Table1")
    public class Session implements Serializable {
     
    	/**
             * serialVersionUID
             */
    	private static final long serialVersionUID = 1L;
     
    	/**
             * id
             */
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "id")
    	private Integer id;
     
    	/**
             * nom
             */
    	@Column(name = "nom", nullable = false)
    	private String nom;
     
    	@Transient
    	private List<TAble2> listTable2;
    }
    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
    @Entity
    @Table(name = "Table2")
    public class Route implements Serializable{
     
    	/**
             * serialVersionUID
             */
    	private static final long serialVersionUID = 1L;
     
    	/**
             * id
             */
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "id")
    	private Integer id;
     
    	/**
             * champ
             */
    	@Column(name = "champ")
    	private String champ;
     
    	/**
             * idTable1
             */
    	@ManyToOne
    	@JoinColumn(name = "idTable1", referencedColumnName = "id", nullable = false)
    	private Table1 idTable1;	
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		listTable1= (List<Table1>) entityManagerFactory.createQuery("FROM Table1 JOIN FETCH Table2.Table1", Table1.class).getResultList();

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Tu as mal compris l'exemple:
    Citation Envoyé par andry.aime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listTable1 = (List<Table1>) entityManagerFactory.createQuery("FROM Table1 t1 join fetch t1.t2", Table1.class).getResultList();
    Soit t1 l'alias de l'entité Table1 dans le jpql et t2 (j'ai mis t2 pour l'exemple) le nom de l'attribut de la 2ème table dans l'entité Table1.

    Tu aurais au moins pris soin de tout renommer tes classes et nom d'attribut au lieu de poster de code à moitié modifier qui rend difficile de t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Entity
    @Table(name = "Table1")
    public class Session implements Serializable {
     
    @OneToMany(mappedBy="route")
    private List<Route> routes;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listTable1= (List<Session>) entityManagerFactory.createQuery("SELECT DISTINCT s FROM Session s JOIN FETCH s.routes", Session.class).getResultList();
    A+.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Quel est l'utilisé du DISTINCT ici?

    Actuellement, j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Entity
    @Table(name = "Session")
    public class Session implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "idSession")
    	private Integer idSession;
     
    	@OneToMany(mappedBy="idRoute")
    	private List<Route> listRoutes;
    }
    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
    @Entity
    @Table(name = "Route")
    public class Route implements Serializable{
     
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "idRoute")
    	private Integer idRoute;
     
    	@ManyToOne
    	@JoinColumn(name = "session", referencedColumnName = "idSession", nullable = false)
    	private Session session;	
    }
    Est-ce correct au niveau des jointures. Une Session doit contenir une liste de route

    DAO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		listSessions = (List<Session>) entityManagerFactory.createQuery("SELECT DISTINCT s FROM Session s JOIN FETCH s.listRoutes", Session.class).getResultList();

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    J'ai fait une erreur dans mon exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	@OneToMany(mappedBy="session")
    	private List<Route> listRoutes;
    L'utilité du distinct c'est d'avoir d'objet Session distincte dans la liste. Parce qu'avec la jointure, tu auras une même session qui se répète autant de fois que le nombre de routes qui vont avec.

    A+.

Discussions similaires

  1. requete sql jointure + sum() + group by?
    Par bylka dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2008, 12h06
  2. requete sql jointure
    Par DIDIDIDA dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/03/2008, 11h02
  3. Problème requete SQL avec hibernate
    Par kakahn dans le forum Hibernate
    Réponses: 4
    Dernier message: 13/01/2008, 12h08
  4. [SQL] Probleme requete sql (jointure)
    Par Pepito2030 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/09/2006, 18h15
  5. Requete SQL jointure plusieurs tables
    Par bibicha dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/08/2006, 17h38

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