Bonjour
Voici les données schématisées de mon problème :
J'ai une classe abstraite AbstractAnimal
2 classes concrètes Chien et Chat qui étendent la classe AbstractAnimal
Les 2 classes concrètes ont une relation sur la classe Croquette (vous foutez pas de ma gueule, je suis pas inspiré pour les exemples...).
1 2 3 4 5 6 7 8 9
| class Chien extends AbstractAnimal {
Long id;
Set<Croquette> croquettes;
...
} |
et
1 2 3 4 5 6 7 8 9
| class Chat extends AbstractAnimal {
Long id;
Set<Croquette> croquettes;
...
} |
Les classes AbstractAnimal, Chien, Chat et Croquette sont mappées par Hibernate. La stratégie de mapping de l'héritage entre AbstractAnimal / Chien et AbstractAnimal / Chat est "table per subclass". Les relations entre Chien / Croquette et Chat / Croquette sont effectuées via des <set> dans les hbm. Ces relations sont lazy.
Mon problème : je veux effectuer une requête polymorphique (sur AbstractAnimal qui me ramène des Chien et des Chat) avec une jointure sur croquette pour éviter le lazy-loading.
Voici ma requête HQL :
from AbstractAnimal a left join fetch a.croquettes
Cette requête ne marche pas. J'ai une erreur Oracle m'informant que j'ai des noms de colonnes ambigus dans la requête SQL.
java.sql.SQLException: ORA-00918: column ambiguously defined
En effet, Hibernate crée une requête SQL avec deux jointures vers la table Croquette (une pour la relation avec Chien et une pour la relation avec Chat) mais avec deux alias identiques. D'où le problème.
Si je renomme les attributs "croquettes" des classes concrètes en "chienCroquettes" et "chatCroquettes" dans mes classes et dans le mapping et que je crée la requête HQL suivante :
from AbstractAnimal a left join fetch a.chienCroquettes left join fetch a.chatCroquettes
ça marche.
Dans ce cas précis où :
- je sollicite des relations dans des sous-objets portées par des attributs ayant le même nom
- dans une requête polymorphique
il semblerait donc vraiment qu'il y ait un problème dans le mécanisme de la construction de la requête SQL par Hibernate.
Bon ! Voilà ! Est-ce que je m'y prends mal ? est-ce une limitation de Hibernate ?
Bref j'aimerais trouver une autre solution que renommer tous les fields porteur de relation ayant le même nom dans différent objets de l'arbre d'héritage. Surtout que dans mon cas réel, il y a énormément plus d'impacts que dans le petit exemple ci-dessus.
Merci d'avance pour votre aide.
Partager