J'ai une requête SQL personnalisée dans Hibernate (3.5.2) dans laquelle je veux retourner un objet mappé, et un objet associé (joint). Cependant, Hibernate semble me donner une liste de tableaux plutôt qu'une liste d'objets.Hibernate requête SQL personnalisée avec join - évitant de retourner une liste de tableaux
Pour simplifier ma situation un peu: -
Entité1 contient une clé étrangère à Entity2, et les objets mis en correspondance sont mis en place afin que Entité1 a une propriété d'objet faisant référence Entity2. Je souhaite récupérer une liste d'objets Entity1, mais avec la référence d'objet associée déjà initialisée (de sorte que l'objet associé a été chargé).
Maintenant, je peux le faire avec une requête SQL personnalisée comme ceci:
final SQLQuery qry = hibernateSession.createSQLQuery(
"select {entity1.*}, {entity2.*} from entity1 inner join entity2 on entity1.fk = entity2.id ");
qry.setReadOnly(true);
qry.addEntity("entity1", Entity1.class);
qry.addJoin("entity2", "entity1.entity2");
List list = qry.list(); // Returns list of arrays!!
Cela fonctionne, en ce que tous les objets sont correctement entity1 initialisées. Cependant, la liste que je récupère n'est PAS une liste simple d'objets Entity1. C'est en fait une liste de tableaux, où chaque tableau contient 2 éléments - Entity1 et Entity2. Je suppose que c'est parce que j'ai mis deux entrées d'alias dans la clause SELECT.
Si je supprime le second alias (pour Entity2), je reçois simplement des erreurs "column not found" - probablement parce que Hibernate ne trouve pas les champs pour initialiser entity2.
Des idées? J'ai une requête qui peut retourner les champs pour l'objet primaire et associé, mais je veux que la liste retournée soit simplement une liste d'objets Entity1.
Commentaire préemptif: Oui, je sais que je pourrais probablement restructurer cela et faire la requête d'une manière différente (API de critères, etc.). Mais c'est ce que je suis coincé pour le moment. Dans cette situation particulière, je suis contraint par d'autres facteurs, alors j'espérais qu'il y avait juste une façon de dire à Hibernate ce que je veux!
Merci.
Vous souhaitez specifially faire avec une requête SQL natif, ou serait HQL faire? –
Vous pouvez faire une jointure interne en utilisant HQL sur des relations non mappées comme ceci: 'select * from Entity1 e1, Entity2 e2 où e1.fk = e2.id'. [Cela malheureusement ne fonctionne pas pour les jointures externes] (http://stackoverflow.com/questions/9892008/hql-left-join-of-un-related-entities). – r0estir0bbe
c'est facile dans HQL, ce qui est dans votre requête qui ne peut pas être fait avec HQL? –