Проблема запроса NHibernate CreateCriteria - PullRequest
1 голос
/ 29 июля 2010

Я надеюсь, что кто-то может помочь с этим, пожалуйста.Я пытаюсь запросить таблицу фактов OLAP с помощью NHibernate, но изо всех сил пытаюсь заставить ее работать.Это кажется простым требованием, но я просто не понимаю, в чем проблема.У меня есть центральная таблица фактов с несколькими таблицами измерений, одно из измерений имеет вторичное измерение.Так что ERD есть.Факт> --- 1 Factor_Dim> --- 1 Target_DimМой запрос NHibernate:.

fact = session.CreateCriteria (typeof (Fact), "fact").CreateAlias ​​("facts.FactorDimension", "factDim", JoinType.InnerJoin).CreateAlias ​​("factDim.TargetDimension", "targetDim", JoinType.InnerJoin).Add (Restrictions.Eq ("targetDim.TargetID", targetId)).List ();

Ошибка «Идентификатор из нескольких частей» targettdim2_.TargetID «Не удалось связать.».Сгенерированный SQL не имеет таблиц Factor_DIM или Target_DIM в предложении From.

Есть ли альтернативные методы, чтобы этот запрос работал?Я хотел бы придерживаться этого стиля, в отличие от CreateSQLQuery (), если это возможно.

Пожалуйста, помогите.Спасибо.

1 Ответ

0 голосов
/ 30 июля 2010

Linq или QueryOver будут вашими самыми чистыми решениями.Если вы полны решимости остаться с ICriteria, вы, вероятно, захотите обернуть каждую из ваших сущностей классом с помощью общих методов crud, это также сделает ваш код доступным, так что исправления кода выполняются в одном месте, а не над сотнями файлов или классов.

На http://nhforge.org/wikis/general/open-source-project-ecosystem.aspx есть множество проектов, которые могут вам помочь.Я знаю, что NhGen (http://sourceforge.net/projects/nhgen/) создает класс CRUD для каждой сущности на основе класса GenericDao NHibernate.Burrows с несколькими методами CRUD.Он заботится обо всех псевдонимах и объединениях, поэтому запросы становятся такими простыми, как

IMessageDao messageDao = new MessageDao();
// Get All
IList<IMessage> messageList1 dao.FindAll();
// Find using QueryByExample
IList<IMessage> messageList2 = dao.FindByExample(messageDetails, orderBy)).ToList();
// Find using a simple entity query
IList<IMessage> messageList3 = messageDao.Find( new [] { Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked) } );
// Find using a join and a query on said joined entities
IList<IMessage> messageList4 = messageDao.Find
( new []
    {
        Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked),
        Restrictions.Eq(MessageHelper.Columns.IsActive, true))
    }, new[]
    {
        Restrictions.Eq(CategoryHelper.KeyColumns.Rsn, categoryRsn),
        Restrictions.Eq(CategoryHelper.Columns.IsActive, true))
    }, new []
    {
        Restrictions.Eq(ChannelHelper.KeyColumns.Rsn, channelRsn),
        Restrictions.Eq(ChannelHelper.Columns.IsActive, true))
    }
);

. Существует множество переопределений, поэтому вы можете указать свой тип объединения или, естественно, оно предполагает внутреннее соединение.

...