Double Join qui ne retourne pas d'éléments
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:
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:
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:
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:
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:
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:
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(); |