2009-10-29 2 views
1

J'ai une entité mappée avec une propriété « latestHistory », qui est tracé à travers une table de jointure, comme:se joindre à l'aide @JoinTable semblables dans SQLQuery avec

class Record { 

    @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.LAZY, optional = true) 
    @JoinTable(name = "latest_history_join_view", joinColumns = { @JoinColumn(name = "record_id") }, inverseJoinColumns = { @JoinColumn(name = "history_id") }) 
    @AccessType("field") 
    public History getLatestHistory() { ... } 
} 

L'application fonctionne correctement quand je l'appelle myRecord.getLatestHistory ().

J'ai une requête SQL native complexe, qui renvoie un lot d'enregistrements, et se joint à l'historique pour chaque enregistrement à l'aide de la table de jointure. Je souhaite renvoyer des Entites d'enregistrement à partir de la requête et avoir les objets Historique renseignés dans le résultat. Ma tentative ressemble à ceci:

StringBuffer sb = new StringBuffer(); 
sb.append("select {r.*}, {latestHistory.*}"); 
sb.append(" from record r"); 
sb.append(" left join latest_history_join_view lh on lh.record_id = r.record_id"); 
sb.append(" left join history latestHistory on latestHistory.history_id = lh.history_id"); 
SQLQuery query = session.createSQLQuery(sb.toString()); 
query.addEntity("r", Record.class).addJoin("latestHistory", "r.latestHistory"); 

Quand je fais cela, il génère une requête comme:

select 
    r.record_id, r.name..., 
    r_1.history_id, --this part is wrong; there is no such alias r_1 
    latestHistory.history_id, latestHistory.update_date, ... 
from record r 
left join latest_history_join_view lh on lh.record_id = r.record_id 
left join history latestHistory on latestHistory.history_id = lh.history_id 

Comment puis-je obtenir à se joindre correctement quérir mon association, sans déconner la liste de sélection ?

[Mise à jour: quelques-unes des approches que j'ai essayé:

select {r.*}, {latestHistory.*} -> SQL error, generates a wrong column name "r_1.history_id" 
select {r.*}, {anyOtherEntityAssociatedToR.*} -> wrong column name (as above) 
select {r.*}, {r.history_id}, {latestHistory.*} -> hibernate error, r has no history_id column 
select r.*, lh.history_id as history_id -> this works (though hackish), but doesn't accomplish the join 
select r.*, lh.history_id as history_id, latestHistory.* -> appears correct, but results in column name collisions 
select r.*, {latestHistory.*} -> error when hibernate looks for a nonexistent column in the result set (this happens if there is any alias at all in the select list) 

Il ne semble pas faire beaucoup de différence si j'utilise addEntity (...) ou addJoin (...), tant que l'entité (racine) la plus à gauche est ajoutée avec addEntity.

]

+0

J'ai trouvé un moyen de faire toute ma requête en utilisant HQL (HQL left join fetch fonctionne correctement, "left join" sans "fetch" lors d'une requête agrégée). Je ne pouvais pas trouver une solution de travail complète pour ce problème SQL natif. – RMorrisey

Répondre

1

je penser que vous avez réellement besoin de spécifier le chemin complet pour votre latestHistory dans select par exemple Sinon, Hibernate devient confus et tente de le traiter comme une entité distincte. L'autre option consiste à ne pas spécifier d'alias injectés dans select tout ce qui should work for a single "to-one" relationship tant que l'ordre des colonnes dans vos tables correspond à l'ordre des propriétés dans vos entités. Cependant, je n'ai jamais essayé cela sur @OneToOne sur une table d'association.

+0

Merci, Chss - J'essaie r.latestHistory. *. Comment le ferais-je sans spécifier d'alias injectés? – RMorrisey

+0

Tant que l'ordre des colonnes/propriétés correspond, vous devriez être capable de faire 'select r. *, LatestHistory. *' - c'est-à-dire, en utilisant des alias SQL plutôt que des alias injectés. – ChssPly76

+0

En utilisant {r.latestHistory. *}, J'obtiens: org.hibernate.QueryException: Aucun nom de colonne trouvé pour la propriété [latestHistory. *] Pour l'alias [r] – RMorrisey