我希望有人能帮忙解决这个问题。
我试图用NHibernate查询OLAP Fact表,但我正在努力让它工作。它似乎是一个简单的要求,但我不知道问题可能是什么。
我有一个带有几个Dimension表的中心Fact表,其中一个Dimensions有一个辅助Dimension。
所以ERD是。事实> --- 1 Factor_Dim> --- 1 Target_Dim
我的NHibernate查询是。
facts = session.CreateCriteria(typeof(Fact),“facts”)
.CreateAlias(“facts.FactorDimension”,“factDim”,JoinType.InnerJoin)
.CreateAlias(“factDim.TargetDimension”,“targetDim”,JoinType.InnerJoin)
.Add(Restrictions.Eq(“targetDim.TargetID”,targetId))
.LIST();
错误是“多部分标识符”targetdim2_.TargetID“无法绑定。”。生成的SQL在From子句中没有Factor_DIM或Target_DIM表。
是否有任何替代技术可以使此查询生效?我想坚持这种风格而不是CreateSQLQuery(),如果可能的话。
请帮忙。感谢。
答案 0 :(得分:0)
Linq或QueryOver将是您最干净的解决方案。如果您决定继续使用ICriteria,您可能希望使用具有常见crud方法的类来包装每个实体,这也会使您的代码访问变得常见,因此代码更正可以在一个地方完成,而不是在文件或类的过程中完成
http://nhforge.org/wikis/general/open-source-project-ecosystem.aspx的大量项目可以帮到你。我知道NhGen(http://sourceforge.net/projects/nhgen/)基于NHibernate.Burrows GenericDao类和一些CRUD方法为每个实体创建一个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))
}
);
有很多覆盖,因此您可以指定您的连接类型,或者它自然地假定内部连接。