2011-06-29 42 views
5

我有三個表:NHibernate的內部連接提供了 「路徑預期加入」

- Person 
- User 
- PersonSecret 

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

這是從用戶的映射轉到PersonSecret:

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

這從人到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:「加入的路徑」

有人可以幫助我,我做錯了什麼? - 謝謝。

回答

3

有幾個問題與您的HQL查詢:

  • 當使用HQL需要參考屬性的名稱,你的模型類的而不是列名它們映射到。在這種情況下,應該在where子句中引用PersonSecret.User.Id屬性,而不是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

@Enrico - 這給了我同樣的錯誤:-( – BennoDual

+0

@ t.kehl我有點快要回答這個問題了,我用不同的解決方案更新了我的答案 –

+0

@Enrico - Can你解釋我,如何做到這一點:「在連接子句中指定Person.PersonSecrets屬性」? – BennoDual

-1

你已經忘記了「ON」一詞。

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

HQL不支持SQL連接語法。 –

+0

然後使用CreateSQLQuery而不是CreateQuery – Anubis

相關問題