NHibernate:关联时鉴别器查询

时间:2013-06-24 19:03:30

标签: nhibernate nhibernate-criteria

我的问题类似于this question。 但我想通过与一对一关系相关联的子实体的鉴别器进行查询,并且不知道确切的鉴别器值,即不是通过字符串而不是字符串。

给出了像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>();
}

更多信息:

  • 上述条件查询失败,因为&#34; Child.class&#34;不被视为有效。

  • 使用HQL的类似查询失败,因为NHibernate在查询中使用了childType的全名而不是其鉴别器值。

1 个答案:

答案 0 :(得分:3)

您是否尝试过使用别名?我现在无法在我的机器上测试它,但应该与此相似..

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

其中ParentChild只是我用来引用Parent类的Child实体的名称