【问题标题】:How to use NHibernate's ICriteria for grouping, fetching associations and T-SQL functions如何使用 Hibernate Criteria 进行分组、获取关联和 T-SQL 函数
【发布时间】:2010-03-05 12:00:27
【问题描述】:

我要创建以下 T-SQL 语句:

SELECT  SUM (sa.Amount) as 'SumAmount',
        SUM(sa.Cost) as 'SumCost', 
        gg.[Description] as 'Goodsgroup', Month(sa.[Date]) as 'Month' 
FROM SalesmanArticle sa
INNER JOIN Article a
    ON a.ArticleId = sa.ArticleId
INNER JOIN GoodsGroup gg
    ON gg.GoodsGroupId = a.GoodsGroupId
GROUP BY gg.[Description], Month(sa.[Date])
ORDER BY 'Month', 'Goodsgroup'

NHibernates ICriteria 可以做到这一点吗?

如何使用 Month-T-SQL-Function?

我必须手动加入还是 ICriteria API 知道当我使用propetyName 'SalesmanArticle.Article.Goodsgroup.Description' 时它必须加入文章和货物组?

编辑:

现在我在这里写了这段代码:

// typesafe properties
string article = typeof(Article).Name;
string goodsGroup = typeof(GoodsGroup).Name;
string salesmanArticle = typeof(SalesmanArticle).Name;

string amount = Reflector.GetPropertyName<SalesmanArticle>(x => x.Amount);
string cost = Reflector.GetPropertyName<SalesmanArticle>(x => x.Cost);
string description = string.Format("{0}.{1}",
    goodsGroup, Reflector.GetPropertyName<SalesmanArticle>(x => x.Article.GoodsGroup.Description));
string date = Reflector.GetPropertyName<SalesmanArticle>(x => x.Date);

string formatedDate = string.Format("MONTH([{0}])", date);

return GetSession()
    // FROM
    .CreateCriteria(typeof(SalesmanArticle), salesmanArticle)
    // JOIN
        .CreateCriteria(article, article, JoinType.InnerJoin)
        .CreateCriteria(goodsGroup, goodsGroup, JoinType.InnerJoin)
    // SELECT
        .SetProjection(Projections.ProjectionList()
                           .Add(Projections.Sum(amount))
                           .Add(Projections.Sum(cost))
    // GROUP BY
                           .Add(Projections.GroupProperty(description))
                           .Add(Projections.SqlGroupProjection(formatedDate, formatedDate, new[]{"MyDate"} , new[] { NHibernateUtil.Int32 })))
        .List();

但是会抛出 AdoException:

无法执行查询 [SELECT sum(this_.Amount) as y0_, sum(this_.Cost) as y1_, 商品组2_.描述为y2_, MONTH([Date]) FROM [SalesmanArticle] this_ 内连接【文章】article1_ 关于 this_.ArticleId=article1_.ArticleId 内联[GoodsGroup]goodsgroup2_ 在 article1_.GoodsGroupId=goodsgroup2_.GoodsGroupId GROUP BY goodsgroup2_.描述, 月([日期])]

[SQL: 选择 sum(this_.Amount) as y0_, sum(this_.Cost) as y1_, 商品组2_.描述为y2_, MONTH([Date]) FROM [SalesmanArticle] this_ 内连接【文章】article1_ 关于 this_.ArticleId=article1_.ArticleId 内联[GoodsGroup]goodsgroup2_ 在 article1_.GoodsGroupId=goodsgroup2_.GoodsGroupId GROUP BY goodsgroup2_.描述, 月([日期])]

奇怪的是 NHibernate 尝试创建 2 个查询?!

而且两个都是正确的!

代替代码行

.Add(Projections.SqlGroupProjection(formatedDate, formatedDate, new[]{"MyDate"} , new[] { NHibernateUtil.Int32 })))

我用过

.Add(Projections.SqlFunction("MONTH", NHibernateUtil.Int32, Projections.GroupProperty(date))))

SqlFunction 的问题在于它创建了一个 GROUP BY sa.Date 而不是 MONTH(sa.Date)。但是这种方法在语法上是正确的。

所以我切换到SqlGroupProjection 方法。

但无论如何它不起作用。

谁能帮帮我?

【问题讨论】:

    标签: tsql nhibernate group-by icriteria


    【解决方案1】:

    我解决了。这是正确的代码:

    public class SalesmanArticleRepository : Repository<SalesmanArticle>, ISalesmanArticleRepository
    {
        public IList GetAllAll()
        {
            // typesafe properties
            string article = typeof(Article).Name;
            string goodsGroup = typeof(GoodsGroup).Name;
            string salesmanArticle = typeof(SalesmanArticle).Name;
    
            string amount = Reflector.GetPropertyName<SalesmanArticle>(x => x.Amount);
            string cost = Reflector.GetPropertyName<SalesmanArticle>(x => x.Cost);
            string description = string.Format("{0}.{1}",
                goodsGroup, Reflector.GetPropertyName<SalesmanArticle>(x => x.Article.GoodsGroup.Description));
            string date = Reflector.GetPropertyName<SalesmanArticle>(x => x.Date);
    
            string formatedDateSql = string.Format("month({{alias}}.[{0}]) as mydate", date);
            string formatedDateGroupBy = string.Format("month({{alias}}.[{0}])", date);
    
            return GetSession()
                // FROM
                .CreateCriteria(typeof(SalesmanArticle), salesmanArticle)
                // JOIN
                    .CreateCriteria(article, article, JoinType.InnerJoin)
                    .CreateCriteria(goodsGroup, goodsGroup, JoinType.InnerJoin)
                // SELECT
                    .SetProjection(Projections.ProjectionList()
                                       .Add(Projections.Sum(amount))
                                       .Add(Projections.Sum(cost))
                // GROUP BY
                                       .Add(Projections.GroupProperty(description))
                                       .Add(Projections.SqlGroupProjection(formatedDateSql, formatedDateGroupBy, new[] { "mydate" }, new[] { NHibernateUtil.Int32 })))
                    .List();
        }
    }
    

    【讨论】:

    • 你知道在hql怎么做吗?我爱Hql
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多