NHibernate CreateCriteria查询问题

时间:2010-07-29 09:31:43

标签: sql nhibernate hibernate nhibernate-mapping

我希望有人能帮忙解决这个问题。
我试图用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(),如果可能的话。

请帮忙。感谢。

1 个答案:

答案 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))
    }
);

有很多覆盖,因此您可以指定您的连接类型,或者它自然地假定内部连接。