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 :

Jointure avec Hibernate via Criteria


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut Jointure avec Hibernate via Criteria
    Je risque de me faire tirer dessus mais j'ai un souci par rapport à Hibernate.
    Je n'utilise que les Criteria pour une total abstraction.
    J'ai 4 tables qui sont liés entre elle:
    table1, table2, table3 et table4.

    La table1 et table3 sont des tables qui sont totalement indépendantes.

    La table2 est une table qui est formé d'informations provenant de la table1 et table3 (foreign key) + d'autres informations.

    La table4 est une table qui existe uniquement pour une table3.

    je voudrais récupéré avec Hibernate une collection d'objets (List) de la table2
    avec comme contrainte une reference de la table1, et une reference de la table4.

    Donc en SQL ca donne ca a peu pres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT table2.infos 
    FROM table1, table2, table3, table4 
    WHERE table2.idtable1 = table1.idtable1
    AND table2.idtable3 = table3.idtable3
    AND table4.idtable3 = table3.idtable3
    AND table4.uneinfo = 'moninfo'
    AND table2.uneautreinfo = 'uneautreinfo';
    Dans mon mapping hibernate (HBM) on a a peu près ceci

    table1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.monpackage">
    	<class name="Table1" table="table1">
    		<id name="id" column="id">
    			<generator class="native" />
    		</id>
    		<property name="info1" column="info1" />
    		...
    	</class>
    </hibernate-mapping>
    table2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.monpackage">
    	<class name="Table2" table="table2">
    		<id name="id" column="id">
    			<generator class="native" />
    		</id>
    		<property name="info2" column="info2" />
    		...
    		<many-to-one name="table1" column="table1" />
    		<many-to-one name="table3" column="table3" />
    	</class>
    </hibernate-mapping>
    table3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.monpackage">
    	<class name="Table3" table="table3">
    		<id name="id" column="id">
    			<generator class="native" />
    		</id>
    		<property name="info3" column="info3" />
    		...
    	</class>
    </hibernate-mapping>
    table4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.monpackage">
    	<class name="Table4" table="table4">
    		<id name="id" column="id">
    			<generator class="native" />
    		</id>
    		<property name="info4" column="info4" />
    		...
    		<many-to-one name="table3" column="table3" />
    	</class>
    </hibernate-mapping>
    Donc pour récupérer ma liste d'objets de la table2 je fais quelque chose comme 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
    15
    16
    17
    18
    19
    Session session = getCurrentSession();
    Criteria c = session.createCriteria(Table2.class);
     
    // Pour la jointure avec ma table3
    c.createAlias("table2.table3", "table3");
     
    // Pour ma jointure avec ma table4
    c.createAlias("table3.table4", "table4");
     
    // Pour ma contrainte sur la table4
    c.add(Restrictions.eq("info4", Table4.getInfo4()));
     
    // Pour ma jointure avec ma table1
    c.createAlias("table2.table1", "table1");
     
    // Pour ma contrainte sur la table1
    c.add(Restrictions.eq("info1", Table1.getInfo1()));
     
    return c.list();
    Je suis un peu perdu. En fait le gros du pb vient du lien entre table3 et table4.
    Les autres liens : pas de souci.
    Mais arriver a accéder aux éléments de la table4 a partir d'un élément de la table3 en mettant une contrainte sur les éléments de la table4.

    Il y a aussi une contrainte sur les perfs. Je ne veux pas charger tout les éléments lié a la table3 (éléments de la table4) a chaque chargement d'un élément de la table3.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut
    C'est normal, ta table table3 ne connait pas la table4, et comme la table2 ne la connait pas non plus.... pas de jointure poissible dans ce sens.
    Il te faut déclarer un lien one-to-many ou many-to-one (tout dépend du schéma de tes tables) dans la table3 vers la table4.
    Après tu pourras alors accéder aux informations de la table4.
    Concernant les perfs, si tu laisse le lazy à true (paramètre par défaut à partir de la version 3) tu ne risque pas de charger tout.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Citation Envoyé par willbback Voir le message
    C'est normal, ta table table3 ne connait pas la table4, et comme la table2 ne la connait pas non plus.... pas de jointure poissible dans ce sens.
    Il te faut déclarer un lien one-to-many ou many-to-one (tout dépend du schéma de tes tables) dans la table3 vers la table4.
    Après tu pourras alors accéder aux informations de la table4.
    Concernant les perfs, si tu laisse le lazy à true (paramètre par défaut à partir de la version 3) tu ne risque pas de charger tout.
    Arg. Oui. Mais j'ai oublié de préciser ceci (qui est très important)
    J'ai bien ceci dans l'HBM de ma table3
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.monpackage">
    	<class name="Table3" table="table3">
    		<id name="id" column="id">
    			<generator class="native" />
    		</id>
    		<property name="info3" column="info3" />
    		...
    		<set name="table4" table="table4" inverse="true" order-by="id" cascade="all">
    			<key column="idtable3" />
    			<one-to-many class="table4" />
    		</set>
    	</class>
    </hibernate-mapping>
    Donc a priori a partir d'un élément de la table3 je peux récupérer ou faire des jointure avec la table4.

    Edit: J'ai d'ailleur la meme chose pour réaliser une jointure sur la table2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		<set name="table2" table="table2" inverse="true" order-by="id" cascade="all">
    			<key column="idtable3" />
    			<one-to-many class="table2" />
    		</set>

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 95
    Par défaut
    Bon bon. j'ai trouvé ma solution. Du moins j'obtiens des résultats cohérents mais apres il faut que je test.

    Mon erreur provenait de mon HBM. Enfin pas tout a fait. En fait dans mon HBM (table3) sur ma jointure table3->table4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="table4" table="table4" inverse="true" order-by="id" cascade="all">
    	<key column="idtable3" />
    	<one-to-many class="table4" />
    </set>
    J'avais mis un S a mon name="table4s" . Résultat dans mon criteriaje fais ceci (qui fonctionne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Session session = getCurrentSession();
    Criteria c = session.createCriteria(Table2.class);
    c.add(Restrictions.eq("table1", table2.getidTable1()));
    c.createAlias("table3", "table3");
    c.createAlias("table3.table4s", "table4");
    c.add(Restrictions.eq("table4.info", table4.info()));
    return c.list();

    J'aurai du appeler mes objets Objet4 au lieu de Table4 ca aurait été plus explicit pour mes exemples.
    En tout cas merci pour ton aide willbback!
    Erreur de noob

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/05/2014, 16h05
  2. Jointure avec des Requête Criteria Query
    Par geforce dans le forum Persistance des données
    Réponses: 1
    Dernier message: 26/04/2012, 00h44
  3. Jointure avec Hibernate
    Par bylka dans le forum Hibernate
    Réponses: 39
    Dernier message: 01/09/2011, 11h57
  4. Jointure avec hibernate
    Par Derf4002 dans le forum Hibernate
    Réponses: 10
    Dernier message: 23/05/2008, 12h53

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