Hallo,
bei der Transformation von HQL nach SQL geht der Tabellen-Alias Name verloren und die Datenbank wirft eine
Exception mit der Meldung "Spalte 'STR' in mehr als einer Tabelle gefunden - Korrelationsname erforderlich"
Hier ein leicht vereinfachtes Beispiel:
Meine JPA-Entities:
Code:
@Entity
@Table(name = "ENTITY1")
public class Entity1 {
@EmbeddedId
private MyId id;
@Column(name = "NAME", length = 40, columnDefinition = "char(40)")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns( { @JoinColumn(name = "ENTITY1_ID", referencedColumnName = "ID"),
@JoinColumn(name = "ENTITY1_SECOND_ID", referencedColumnName = "SECOND_ID") })
private Entity1 entity1;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns( { @JoinColumn(name = "ENTITY2_ID", referencedColumnName = "ID", insertable = false, updatable = false),
@JoinColumn(name = "ENTITY2_SECOND_ID", referencedColumnName = "SECOND_ID", insertable = false, updatable = false) })
private Entity2 entity2;
/*Getter und Setter*/
}
Code:
@Entity
@Table(name = "ENTITY2")
public class Entity2 {
@EmbeddedId
private MyId id;
@Column(name = "ORT", length = 40, columnDefinition = "char(40)")
private String ort;
@Column(name = "STR", length = 40, columnDefinition = "char(40)")
private String str;
/*Getter und Setter*/
}
Code:
@Entity
@Table(name = "ENTITY2")
public class Entity2 {
@EmbeddedId
private MyId id;
@Column(name = "ORT", length = 40, columnDefinition = "char(40)")
private String ort;
@Column(name = "STR", length = 40, columnDefinition = "char(40)")
private String str;
/*Getter und Setter*/
}
Meine nicht funktionierende Named Query:
Code:
<named-query name="Todo.selectAllGlueckwuenscheByBenutzer">
<query>
select new de.myentities.SpecialEntity(
T.myid.id,
T.myid.secondId,
T.name,
P.ort,
P.str,
M.ort,
M.str)
FROM Entity1 T
LEFT OUTER JOIN T.entity2 M
LEFT OUTER JOIN T.entity3 P
</query>
</named-query>
Resultierende SQL Query:
Code:
select entity1_.ID as col_0_0_,
entity1_.SECOND_ID as col_1_0_,
entity1_.NAME as col_2_0_,
entity3_.ORT as col_3_0_,
STR as col_4_0_,
entity2_.ORT as col_5_0_,
STR as col_6_0_
from ENTITY1 entity1_
left outer join ENTITY2 entity2_
on entity1_.ENTITY2_SECOND_ID=entity2_.SECOND_ID and entity1_.ENTITY2_ID=entity2_.ID
left outer join ENTITY3 entity3_
on entity1_.ENTITY3_SECOND_ID=entity3_.SECOND_ID and entity1_.ENTITY3_ID=entity3_.ID
Die Fehlermeldung der Datenbank ist verständlich aber wieso lässt Hibernate den Korrelationsname bei dem Feld "STR" weg und bei dem Feld "ORT" nicht?
Ich habe bereits versucht meinen Fehler durch debuggen zu finden, allerdings konnte ich die eigentliche Transformation von HQL nach SQL nicht debuggen weil mir der Quellcode der Hibernate Klasse org.hibernate.hql.antlr.HqlSqlBaseWalker fehlt.
Jemand eine Idee wieso Hibernate der Meinung sein könnte, dass der Korrelationsname nicht nötig ist?
Grüße,
Jonas
---------------------
Hibernate 3.5.1 Final