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:
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 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
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
 
}
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
 
/**
 * @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
}
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
 
/**
 * @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
 
}
Donc pour résumer : (a -> b pour "A connait B")
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 :

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 "
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.

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();