NHibernate:通过鉴别器查询关联

NHibernate:通过鉴别器查询关联,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我的问题类似于。 但是我想通过与一对一关系关联的子实体的鉴别器进行查询,而不知道准确的鉴别器值,即,按类型而不是按字符串 给定一个hbm,如: <class name="Parent" table="ParentTable"> <id name="Id"> <generator class="guid.comb" /> </id> <one-to-one name="Child" class="IChi

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

给定一个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>();
}
public IEnumerable FindByChild(类型childType)
{
返回会话。CreateCriteria()
.Add(Restrictions.Eq(“Child.class”,childType))
.List();
}
进一步资料:

  • 上述条件查询失败,因为“Child.class”未被识别为有效

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


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

return session.CreateCriteria<Parent>()
                .CreateAlias("ParentChild","Child")
                .Add(Restrictions.Eq("ParentChild.class", childType))
                .List<Parent>();
返回会话。CreateCriteria()
.CreateAlias(“父母子女”、“子女”)
.Add(Restrictions.Eq(“ParentChild.class”,childType))
.List();

其中ParentChild只是我用来引用父类的子实体的名称

您尝试过使用别名吗?我现在无法在我的机器上测试它,但应该类似于此

return session.CreateCriteria<Parent>()
                .CreateAlias("ParentChild","Child")
                .Add(Restrictions.Eq("ParentChild.class", childType))
                .List<Parent>();
返回会话。CreateCriteria()
.CreateAlias(“父母子女”、“子女”)
.Add(Restrictions.Eq(“ParentChild.class”,childType))
.List();

其中ParentChild只是我用来指父类的子实体的名称

Ingenious!我不明白为什么这能解决问题,但它确实解决了!谁知道救了我多少小时,谢谢!我很高兴这有帮助。为了更详细地说明答案以及其他可能有类似情况的人,我认为每次需要添加与实体集合相关的条件时,都应该创建一个别名来引用它。至少我是这样做的…很有创意!我不明白为什么这能解决问题,但它确实解决了!谁知道救了我多少小时,谢谢!我很高兴这有帮助。为了更详细地说明答案以及其他可能有类似情况的人,我认为每次需要添加与实体集合相关的条件时,都应该创建一个别名来引用它。至少我是这样做的。。。