2013-06-24 52 views
0

我的問題是類似this question。 但我想用一到一對一的關係相關的子實體的鑑別查詢,並且不知道確切的鑑別值,即按類型不是字符串。NHibernate的:查詢通過鑑別上的關聯

鑑於像HBM:

<class name="Parent" table="ParentTable"> 
    <id name="Id"> 
     <generator class="guid.comb" /> 
    </id> 
    <one-to-one name="Child" class="IChild" property-ref="Parent" cascade="all" /> 
</class> 

<class name="IChild" table="ChildTable" abstract="true"> 
    <id name="Id"> 
     <generator class="foreign"> 
      <param name="property">Parent</param> 
     </generator> 
    </id> 
    <discriminator column="TypeKey" type="String"/> 
    <one-to-one name="Parent" class="Parent" /> 
</class> 

<subclass name="ConcreteChild" extends="IChild" discriminator-value="Concrete1"> 
    <property name="SomeProperty"/> 
</subclass> 

或其他任何一個對一個的配置,我想運行一個類似的查詢:

public IEnumerable<Parent> FindByChild(Type childType) 
{ 
    return session.CreateCriteria<Parent>() 
     .Add(Restrictions.Eq("Child.class", childType)) 
     .List<Parent>(); 
} 

更多信息:

  • 上述標準的查詢,因爲「Child.class」不被識別爲有效的失敗。

  • 使用HQL類似的查詢失敗,因爲NHibernate的使用childType的全名,而不是在查詢其鑑別價值。

回答

3

您是否嘗試過使用別名?我現在不能測試它在我的機器上,而應該與此類似..

return session.CreateCriteria<Parent>() 
       .CreateAlias("ParentChild","Child") 
       .Add(Restrictions.Eq("ParentChild.class", childType)) 
       .List<Parent>(); 

其中父子僅僅是我用來指代父類

+0

巧妙的兒童實體名稱!我無法理解爲什麼這會解決問題,但它確實!爲我節省了多少時間,謝謝! – joniba

+0

我很高興它幫助。只是爲了更多地討論答案和其他可能有類似的情況,我認爲,每次你需要添加相關實體的集合的情況下,你應該建立一個別名來引用它。至少我是這麼做的...... –