2010-07-29 3 views
1

Я надеюсь, что кто-то может помочь с этим, пожалуйста.
Я пытаюсь запросить таблицу фактов OLAP с помощью NHibernate, но я стараюсь заставить ее работать. Это кажется простым требованием, но я просто не могу понять, что может быть проблемой.
У меня есть центральная таблица фактов с несколькими таблицами измерений, один из размеров имеет вторичное измерение.

Таким образом, ERD есть. Факт> --- 1 Factor_Dim> --- 1 Target_Dim

Мой запрос NHibernate.Проблема с NHibernate CreateCriteria

факты = session.CreateCriteria (TypeOf (Факт), "факты")
.CreateAlias ​​("facts.FactorDimension", "factDim", JoinType.InnerJoin)
.CreateAlias ​​("factDim.TargetDimension" , "targetDim", JoinType.InnerJoin)
.Add (Restrictions.Eq ("targetDim.TargetID", targetId))
.List();

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

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

Пожалуйста, помогите. Благодарю.

+1

Как насчет использования строго типизированного/плавного LINQ для NHibernate вместо иногда тенистого API критериев? http://bit.ly/d5xwIB – rebelliard

+1

Не могу сказать много, не видя отображения ... – dotjoe

ответ

0

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

Theres много проектов на http://nhforge.org/wikis/general/open-source-project-ecosystem.aspx, которые могут вам помочь. Я знаю, что NhGen (http://sourceforge.net/projects/nhgen/) создает класс CRUD для каждого объекта на основе класса NHibernate.Burrows GenericDao с несколькими методами 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)) 
    } 
); 

Theres много переопределений, так что вы можете указать тип соединения или он, естественно, предполагает внутреннее соединение.

Смежные вопросы