Внутреннее соединение NHibernate дает "Путь, ожидаемый для соединения" - PullRequest
5 голосов
/ 29 июня 2011

У меня есть три таблицы:

- Person
- User
- PersonSecret

, где PersonSecret ссылается на Person и User:

<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>

Это отображение от пользователя к PersonSecret:

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

А это от человека к человеку Секрет:

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

Теперь я пытаюсь выбрать всех людей, у которых есть запись вPersonSecret для конкретного пользователя:

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

Это дает мне теперь сообщение ExceptionMessage: "Ожидаемый путь для соединения"

Может ли кто-нибудь помочь мне, что я делаю неправильно?- Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Есть несколько проблем с вашим HQL-запросом:

  • При использовании HQL вам необходимо ссылаться на имена свойств классов вашей модели вместо имен столбцов, на которые они отображаются. В этом случае вы должны ссылаться на свойство PersonSecret.User.Id в предложении where вместо столбца UserId.
  • Вы также должны указать свойство Person.PersonSecrets в предложении объединения, иначе NHibernate не будет знать, к каким столбцам присоединиться.
  • Вы должны указать свой дополнительный фильтр как условие соединения , используя ключевое слово with вместо предложения where.

Вот правильная версия:

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

Связанные ресурсы:

0 голосов
/ 29 июня 2011

вы забыли термин "ON".

inner join PersonSecret b ON b.PersonId = a.PersonId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...