Почему мой запрос HQL работает, а версия Criteria - нет? - PullRequest
0 голосов
/ 06 января 2011

Моя (свободно) схема NHibernate немного сложна.Эти два рассматриваемых класса являются специфическими для конкретной страны и наследуются от абстрактного класса.Дело в том, что данные разных стран хранятся в разных таблицах.Все работает нормально, кроме следующего.Этот HQL прекрасно работает:

dbSession.CreateQuery(@"from DateBlock_US db where
            db.HaveListing.City.LocationID = " + searchLocation.LocationID.ToString()).List<DateBlock>();

(я знаю, что должен использовать SetParameter, но это всего лишь демонстрация).Тем не менее, этот критерий не работает:

dbSession.CreateCriteria(typeof(DateBlock_US))
            .Add(Restrictions.Eq("HaveListing.City.LocationID", searchLocation.LocationID))
            .List<DateBlock>();

Дает мне ошибку:

could not resolve property: HaveListing.City.LocationID of: Dm.Mvc.Data.UserObjects.DateBlock_US

Я не могу, на всю жизнь, увидеть, где могут лежать различия,Кто-нибудь может увидеть что-то выскакивающее из них?Или есть ли способ получить базовый HQL из критериев (или аналогичных), чтобы я мог их сравнить?

В случае, если это поможет, мое странное отображение выглядит следующим образом:

public class Map<T> : NotNullableClassMap<T> where T : DateBlock
    {
        public void BaseMap()
        {
            Id(b => b.m_BlockCode).Column("BlockCode").GeneratedBy.GuidComb();
            Map(b => b.StartDate);
            Map(b => b.EndDate);
            Map(b => b.BlockType);

        }
    }

public class DateBlock_US : DateBlock {
    public class DateBlock_US_Map : Map<DateBlock_US>
    {
        public DateBlock_US_Map()
        {
            base.BaseMap();
            References<HaveListing_US>(b => b.HaveListing).Column("HaveListing_US_id");
        }
    }
}

Как я уже сказал, он отлично работает во всех отношениях, кроме этого.

1 Ответ

0 голосов
/ 06 января 2011

Похоже, что решение заключается в добавлении CreateAlias, например так:

dbSession.CreateCriteria(typeof(DateBlock_US))
        .CreateAlias("HaveListing","h")
        .Add(Restrictions.Eq("h.City.LocationID", searchLocation.LocationID))
        .List<DateBlock>();

Однако я был бы очень признателен, если бы кто-нибудь смог пролить свет на , почему это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...