Bonjour,
J'ai un schéma avec beaucoup de données inter-croisées, et je n'arrive pas à y faire les jointures désirées.
J'utilise Hibernate avec xdoclet pour faire le fichier de mapping. Voici les classes qui interviennent dans le cadre de mon problème :
les editeurs:
Les versions publiées :
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 /** * @alias Publisher * @hibernate.class * table="EDITEUR" */ public class Publisher extends DbEntity { /** * * @hibernate.id * generator-class="native" * column="ID_EDITEUR" * access="property" */ @Id public Integer getPk() { return super.getPk(); } + pleins d'attributs scalaires, leurs getter et leur setters }
Les Livres (classe commune à plusieurs publication du même ouvrage) :
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 /** * @alias BookDetails * * @hibernate.class * table="DETAILS" */ public class BookDetails extends DbEntity { private Book _book; private Publisher _publisher; /** * * @hibernate.id * generator-class="native" * column="ID_DETAILS" * access="property" */ @Id public Integer getPk() { return super.getPk(); } /** * Retrieve the link to the book detailed here. * @hibernate.many-to-one * column="ID_OUVRAGE" * class="Book" * not-null="true" * access="property" * lazy="false" * @return this detail's {@link Book}. Shall not be <code>null</code>. * @see #setBook(Book) */ public Book getBook() { return _book; } /** * Retrieve this book details' publisher (mandatory). * @hibernate.many-to-one * column="ID_EDITEUR" * class="Publisher" * not-null="true" * access="property" * lazy="false" * @return the {@link Publisher} of the book. Shall not be <code>null</code>. * @see #setPublisher(Publisher) */ public Publisher getPublisher() { return _publisher; } + d'autres trucs scalaires, les getters et les setters }
Et enfin les gammes (qui sont des ensembles de livres)
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
31
32
33
34
35
36
37
38
39
40 /** * @alias Book * * @hibernate.class * table="OUVRAGE" */ public class Book extends DbEntity { private GameLine _gameLine; /** * * @hibernate.id * generator-class="native" * column="ID_OUVRAGE" * access="property" */ @Id public Integer getPk() { return super.getPk(); } /** * Retrieve the book's game line. * @hibernate.many-to-one * column="ID_GAMME" * class="GameLine" * not-null="true" * access="property" * lazy="false" * @return this book's {@link GameLine}. Shall not be <code>null</code>. * @see #setGameLine(GameLine) */ public GameLine getGameLine() { return _gameLine; } + scalaires, getters, setters }
Donc pour résumer : (a -> b pour "A connait B")
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 /** * @alias GameLine * * @hibernate.class * table="GAMME" */ public class GameLine extends DbEntity { /** * * @hibernate.id * generator-class="increment" * column="ID_GAMME" * access="property" */ @Id public Integer getPk() { return super.getPk(); } + pleins d'attributs scalaires, leurs getter et leur setters }
Publisher <- BookDetails -> Book -> GameLine
Pour 1 publisher donné, je voudrais toutes les gammes dans lesquelles il a publié quelque chose.
Je pensais donc faire une requete HQL avec en parametre une instance d'éditeur, tel que :
Mais cela ne me retourne rien du tout. Bien entendu, la requete SQL correspondante marche tres bien sous SQL*PLUS, en joinant sur les id au lieu des classes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 * @hibernate.query * name="listGameLine" * query="SELECT gl FROM GameLine gl, Book bo, BookDetails bd WHERE bd.publisher=:editeur AND bd.book = bo and bo.gameLine = gl ORDER BY gl.originalTitle "
Quelqu'un aurait-il une idée d'où peut venir mon problème ?
Edit : Je viens d'essayer avec du SQL directement, et ça ne marche pas non plus -___- (Il me fait un java.sql.SQLException: Nom de colonne non valide
)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 availableGame =_dbSession.createSQLQuery("select distinct gl.id_gamme from gamme gl join ouvrage oo on (oo.id_gamme=gl.id_gamme) join details dd on (dd.id_ouvrage=oo.id_ouvrage) where dd.id_editeur = :id_editeur") .addEntity("gl",GameLine.class) .setParameter("id_editeur", editeur.getPk() ) .list();
Partager