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, а не его значение дискриминатора.


person joniba    schedule 24.06.2013    source источник


Ответы (1)


Вы пробовали использовать псевдоним? Я не могу проверить это прямо сейчас на своей машине, но должно быть похоже на это.

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

где ParentChild — это просто имя, которое я использовал для обозначения дочерней сущности родительского класса.

person Sergio A.    schedule 24.06.2013
comment
Гениально! Я не могу понять, почему это решает проблему, но это так! Спас меня черт знает сколько часов, спасибо! - person joniba; 25.06.2013
comment
Я рад, что это помогло. Чтобы подробнее остановиться на ответе и для других, у которых может быть аналогичная ситуация, я считаю, что каждый раз, когда вам нужно добавить условие, связанное с коллекцией объекта, вы должны создать псевдоним для ссылки на него. По крайней мере я так делаю... - person Sergio A.; 26.06.2013