NHibernate: Query by discriminator on association

ぃ、小莉子 提交于 2019-12-12 04:38:32

问题


My question is similar to this question. But I want to query by the discriminator of a child entity associated with a one-to-one relationship, and without knowing the exact discriminator value, i.e., by type not by string.

Given an hbm like:

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

Or any other one-to-one configuration, I would like to run a query similar to this:

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

Further information:

  • The above criteria query fails because "Child.class" is not recognized as valid.

  • A similar query using HQL fails because NHibernate uses the fullname of childType rather than its discriminator value in the query.


回答1:


Have you tried using an alias? I can't test it right now on my machine, but should be similar to this..

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

where ParentChild is just the name I used to refer to the Child entity of the Parent class



来源:https://stackoverflow.com/questions/17283070/nhibernate-query-by-discriminator-on-association

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!