Проблема сопоставления / запроса nHibernate

    // Request.hbm.xml
    <many-to-one name="Grant" class="Grant" column="GrantId" lazy="false"/>

    // Grant.hbm.xml
    <set name="requests" table="Request" generic="true">
      <key column="GrantId" />
      <one-to-many class="Request"/>
    </set>

Сопоставление работает для всего остального, что использует свойство Grant Request. (Я добавил отображение в Grant.hbm.xml, чтобы попытаться решить эту проблему.)

Если я использую строку №1 ниже, NH не сможет найти свойство Status в Grant (true). Если я использую строку №2, NH не сможет найти свойство Grant.PO по запросу (также верно). Как мне заставить NH выглядеть в нужном месте?

    public IList<Request> GetAllActionRequired(string userName)
    {
        ISession session = GetSession();

        return session
            .CreateCriteria(typeof (Request))
            //.CreateCriteria("Grant") #1
            //.SetFetchMode("Grant", FetchMode.Eager) #2a
            //.SetFetchMode("Grant", FetchMode.Join) #2b
            .Add(Restrictions.Disjunction()
                .Add(Restrictions.Conjunction()
                    .Add(Restrictions.Eq("Status", "Draft"))
                    .Add(Restrictions.Eq("Requestor", userName)))
                .Add(Restrictions.Conjunction()
                    .Add(Restrictions.Eq("Status", "Submitted"))
                    .Add(Restrictions.Eq("Grant.PO", userName)))
                ...)
            .List<Request>();
    }

Запрос работает, если я закомментирую союзы, которые отображаются в таблице Grant, поэтому я просто не получаю желаемое соединение.

РЕДАКТИРОВАТЬ, это сработало, СПАСИБО !!!

return session
    .CreateCriteria(typeof (Request), "r")
    .CreateCriteria("Grant", "g")
    .Add(Restrictions.Disjunction()
        .Add(Restrictions.Conjunction()
            .Add(Restrictions.Eq("r.Status", "Draft"))
            .Add(Restrictions.Eq("r.Requestor", userName)))
        .Add(Restrictions.Conjunction()
            .Add(Restrictions.Eq("r.Status", "Submitted"))
            .Add(Restrictions.Eq("g.PO", userName)))
        ...)
        .List<Request>();

person Les    schedule 02.08.2009    source источник


Ответы (1)


Вы должны использовать такие псевдонимы:

return session
        .CreateCriteria(typeof (Request),"req")
        .CreateCriteria("req.Grant","gr") 

а потом

.Add(Restrictions.Eq("req.Status", "Draft"))

or

.Add(Restrictions.Eq("gr.Status", "Draft"))

в зависимости от того, где находятся свойства.

person sirrocco    schedule 03.08.2009