NHibernate内部联接给出了"期望加入的路径"

Ben*_*ual 5 nhibernate hql inner-join

我有三个表:

- Person
- User
- PersonSecret
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

这是从User到PersonSecret的映射:

<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" >
<key>
    <column name="UserId"/>
</key>
<one-to-many class="PersonSecret"/>
Run Code Online (Sandbox Code Playgroud)

这从人到人秘密:

<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" >
<key>
    <column name="PersonId"/>
</key>
<one-to-many class="PersonSecret"/>
Run Code Online (Sandbox Code Playgroud)

现在,我尝试选择所有人员,其具有针对特定用户的EntrySecret入口:

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

这给了我现在的ExceptionMessage:"期望加入的路径"

有人可以帮助我,我做错了什么?- 谢谢.

Enr*_*lio 4

您的 HQL 查询存在几个问题:

  • 使用 HQL 时,您需要引用模型类上的属性名称,而不是它们映射到的列名称。在这种情况下,您应该在 where 子句中引用PersonSecret.User.Id属性,而不是UserId列。
  • 您还应该Person.PersonSecrets在 join 子句中指定该属性,否则 NHibernate 将不知道要连接哪些列。
  • 您应该使用关键字而不是在 where 子句中将附加过滤器指定为连接条件。with

这是正确的版本:

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

相关资源: