NHibernate - Query auf m:n relation - join
NHibernate - Query on many-to-many relation - join
Sonntag 07 März 2010 at 09:57 am. Stichwörter: c#, hql, nhibernate, sql
Ich bin gerade an NHibernate dran. Um das hbm.xml Datei editieren zu umgehen, verwende ich Fluent NHibernate.
Gute Beschreibungen zum Thema und Blog Einträge gibt es im Internet zu hauf.
Insbesondere bei der Definition von m:n Beziehungen per Hibernate bzw. Fluent.
Trotzdem hatte ich das Problem, die HQL Abfrage so zu erstellen, dass eine Verknüpfung der beiden Tabelle über die Mapping Tabelle erfolgt.
Und das, obwohl mir klar war wie ich ein SQL Statement dazu formulieren muss.
DDL
Das Tabellen generieren sieht etwa so aus. Erzeugt vom NHibernate SchemExport für SQLite.
create table Mitarbeiters (
Id integer,
...
MitarbeiterCode TEXT not null unique,
primary key (Id)
)
create table MitarbeiterTelefon (
Mitarbeiter_id INTEGER not null,
Telefonnummer_id INTEGER not null
)
create table Telefonnummern (
Id integer,
...
TelefonnummerMA TEXT not null,
primary key (Id)
)SQL
Das wäre meine SQL Abfrage zu meiner Anforderung.
select * from TELEFONNUMMERN t
inner join MITARBEITERTELEFON mt on t.id = mt.Telefonnummer_id
inner join MITARBEITERS m on mt.Mitarbeiter_id = m.id
where m.MitarbeiterCode = 'XYZ'HQL
Nur eben, wie sieht die Abfrage in HQL aus ?
using(ISession session = this.sessionFactory.OpenSession()) {
using (ITransaction tx = session.BeginTransaction()) {
...
list = session.CreateQuery(
"from Telefonnummer tel inner join fetch tel.Mitarbeiters ma where ma.MitarbeiterCode Like :macode")
.SetParameter("macode", mitarbeiterCode)
.List<Telefonnummer>();
tx.Commit();
Der Vollständigkeit halber, das ist das, was NHibernate generiert.
select
telefonnum0_.Id as Id4_0_,
mitarbeite2_.Id as Id2_1_,
telefonnum0_.IsDeleted as IsDeleted4_0_,
telefonnum0_.CreatedAt as CreatedAt4_0_,
telefonnum0_.CreateMaCode as CreateMa4_4_0_,
telefonnum0_.TelefonnummerMA as Telefonn5_4_0_,
mitarbeite2_.IsDeleted as IsDeleted2_1_,
mitarbeite2_.CreatedAt as CreatedAt2_1_,
mitarbeite2_.CreateMaCode as CreateMa4_2_1_,
mitarbeite2_.Vorname as Vorname2_1_,
mitarbeite2_.Nachname as Nachname2_1_,
mitarbeite2_.Sollstunden as Sollstun7_2_1_,
mitarbeite2_.MitarbeiterCode as Mitarbei8_2_1_,
mitarbeite1_.Telefonnummer_id as Telefonn2_0__,
mitarbeite1_.Mitarbeiter_id as Mitarbei1_0__
from Telefonnummern telefonnum0_
inner join MitarbeiterTelefon mitarbeite1_ on telefonnum0_.Id=mitarbeite1_.Telefonnummer_id
inner join Mitarbeiters mitarbeite2_ on mitarbeite1_.Mitarbeiter_id=mitarbeite2_.Id
where mitarbeite2_.MitarbeiterCode like @p0
Kein Kommentar
