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:
Dans mon mapping hibernate (HBM) on a a peu près ceci
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';
table1:table2:
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>table3:
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>table4:
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>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 <?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>Je suis un peu perdu. En fait le gros du pb vient du lien entre table3 et table4.
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();
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.
Partager