NHibernate内部连接给出“;“连接所需的路径”;

NHibernate内部连接给出“;“连接所需的路径”;,nhibernate,hql,inner-join,Nhibernate,Hql,Inner Join,我有三张桌子: - Person - User - PersonSecret 当人员秘密提及人员和用户时: <class name="PersonSecret" table="PersonSecret" lazy="false" > <id name="Id" column="Id" type="Guid"> <generator class="assigned"/> </id> ... <ma

我有三张桌子:

- Person
- User
- PersonSecret
当人员秘密提及人员和用户时:

<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>
这给了我一条例外消息:“预期加入的路径”

谁能帮帮我,我做错了什么谢谢。

你忘了“开”这个词


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");
相关资源:


HQL不支持SQL连接语法。请使用CreateSQLQuery而不是CreateQuery@t.kehl我回答这个问题有点太快了。我用一个不同的解决方案更新了我的答案。@Enrico-你能解释一下如何做到这一点吗:“在join子句中指定Person.PersonSecrets属性”?@t.kehl我在我的答案中为你提供了查询的正确版本。join子句应该是
来自Person作为内部连接a.PersonSecrets作为b
@Enrico-啊,对不起-它正在工作-我还没有看到PersonSecrets的s:-)-现在很清楚它是如何工作的了非常感谢你的帮助。
<set name="PersonSecrets" lazy="true" inverse="true" cascade="save-update" >
<key>
    <column name="PersonId"/>
</key>
<one-to-many class="PersonSecret"/>
var query = this.Session.CreateQuery(@"from Person a inner join PersonSecret b 
          where b.UserId = :userId and b.RemindeBirthday = :remind");
inner join PersonSecret b ON b.PersonId = a.PersonId
var query = this.Session.CreateQuery(
    @"from Person as a inner join a.PersonSecrets as b with b.User.Id = :userId and b.RemindeBirthday = :remind");