2011-06-29 6 views
5

Mam trzy tabele:NHibernate sprzężenia wewnętrznego daje "Path oczekuje na join"

- Person 
- User 
- PersonSecret 

gdzie PersonSecret odniesienie do osoby i użytkownika:

<class name="PersonSecret" table="PersonSecret" lazy="false" > 
<id name="Id" column="Id" type="Guid">  
       <generator class="assigned"/> 
</id> 
... 
<many-to-one name="Person" class="Person" foreign-key="FK_Person_PersonSecret" lazy="proxy" fetch="select"> 
    <column name="PersonId"/> 
</many-to-one> 
<many-to-one name="User" class="User" foreign-key="FK_User_PersonSecret" lazy="proxy" fetch="select"> 
    <column name="UserId"/> 
</many-to-one> 

To jest odwzorowaniem z Użytkownikiem do PersonSecret:

<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" > 
<key> 
    <column name="UserId"/> 
</key> 
<one-to-many class="PersonSecret"/> 

I to od osoby do PersonSecret:

<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" > 
<key> 
    <column name="PersonId"/> 
</key> 
<one-to-many class="PersonSecret"/> 

Teraz próbuję wybrać wszystkie osoby, która posiada wpis w PersonSecret dla konkretnego użytkownika:

var query = this.Session.CreateQuery(@"from Person a inner join PersonSecret b 
      where b.UserId = :userId and b.RemindeBirthday = :remind"); 

Daje mi to teraz komunikat ExceptionMessage: "Ścieżka oczekiwana dla dołączenia"

Czy ktoś może mi pomóc, co robię źle? - Dzięki.

Odpowiedz

3

Istnieje kilka problemów z zapytania HQL:

  • Przy użyciu HQL trzeba odniesienie nazwy właściwości na swoich klasach modelowych zamiast nazw kolumn ich mapowania . W takim przypadku powinieneś odwołać się do właściwości PersonSecret.User.Id w klauzuli where, zamiast do kolumny UserId.
  • Powinieneś również podać właściwość Person.PersonSecrets w klauzuli join, w przeciwnym razie NHibernate nie będzie wiedział, do których kolumn dołączyć.
  • Należy określić dodatkowy filtr jako warunek łączenia przy użyciu słowa kluczowego with zamiast w klauzuli where.

Oto poprawna wersja:

var query = this.Session.CreateQuery(
    @"from Person as a inner join a.PersonSecrets as b with b.User.Id = :userId and b.RemindeBirthday = :remind"); 

Powiązane zasoby:

+0

@Enrico - Daje mi ten sam błąd :-( – BennoDual

+0

@ t.kehl Byłem trochę szybki, aby odpowiedzieć na to pytanie.Następnie zaktualizowałem moją odpowiedź innym rozwiązaniem –

+0

@Enrico - Can wyjaśnij mi, jak to zrobić: "podaj właściwość Person.PersonSecrets w klauzuli join"? – BennoDual

-1

zapomniałeś terminu "ON".

inner join PersonSecret b ON b.PersonId = a.PersonId 
+1

HQL nie obsługuje składni SQL przyłączyć. –

+0

następnie użyj CreateSQLQuery zamiast CreateQuery – Anubis

Powiązane problemy