NHibernate内连接给出“路径预期加入”的错误

5

我有三个表:

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

这是从用户到个人机密信息的映射:
<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" >
<key>
    <column name="UserId"/>
</key>
<one-to-many class="PersonSecret"/>

这是来自个人到个人(P2P)秘密通信的内容:

<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");

这让我现在得到了异常信息:"需要为连接提供路径"。
有人能帮我吗,我做错了什么? - 谢谢。
2个回答

4

您的HQL查询存在一些问题:

  • 使用HQL时,您需要引用模型类的属性名称而不是它们映射到的列名。在这种情况下,您应该在where子句中引用PersonSecret.User.Id属性,而不是UserId列。
  • 您还应该在join子句中指定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");

相关资源:


@t.kehl我回答得有点太快了。我用另一种解决方案更新了我的答案。 - Enrico Campidoglio
@Enrico - 你能解释一下如何做到这一点吗:“在连接子句中指定Person.PersonSecrets属性”? - BennoDual
@t.kehl 我已在我的答案中提供了正确的查询版本。联接子句应为 from Person as a inner join a.PersonSecrets as b - Enrico Campidoglio
@Enrico - 啊,对不起 - 它正在工作 - 我没有看到 PersonSecrets 中的 s :-) - 现在清楚了这是如何工作的。- 非常感谢你的帮助。 - BennoDual

-1

你忘记了加上“ON”这个词。

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

1
HQL不支持SQL的join语法。 - Enrico Campidoglio
请使用CreateSQLQuery而不是CreateQuery。 - Anubis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接