代码之家  ›  专栏  ›  技术社区  ›  Alistair

nhibernate:基于列获取不同的结果,但检索所有列

  •  6
  • Alistair  · 技术社区  · 16 年前

    我有一个包含glcode的gl表。我需要得到一个唯一glcode的列表,但是要得到所有其他列。下面的sql生成我想要的结果。

    select * from GL where GLId in (select Min(GLId) from GL group by GLCode )
    

    有没有办法使用criteria api来实现这一点?

    这是我最好的尝试:

            var subQuery = DetachedCriteria.For<GL>();
            subQuery
                .SetProjection(Projections.Property("GLCode"))                
                .SetResultTransformer(new DistinctRootEntityResultTransformer());
    
            return (List<GL>)currentSession
                .CreateCriteria(typeof(GL))
                .Add(Subqueries.PropertyIn("GLCode", subQuery))
                .List<GL>();   
    
    1 回复  |  直到 13 年前
        1
  •  3
  •   Daniel Schilling Aaron Palmer    15 年前

    尽管nhibernate没有办法从子查询的结果列中排除glcode,但是仍然可以创建一个执行此任务的查询。使用相关的exists子查询而不是in。我们要拍摄的SQL如下:

    select query.*
    from GL query
    where exists (
        select
            min(subquery.GLId) AS GLId,
            subquery.GLCode
        from GL subquery
        group by subquery.GLCode
        having min(subquery.GLId) = query.GLId);
    

    下面是nhibernate查询:

    var min = Projections.Min("GLId");
    
    var subquery = DetachedCriteria.For<GL>("subquery")
        .SetProjection(Projections.ProjectionList()
            .Add(Projections.GroupProperty("GLCode"), "GLCode")
            .Add(min, "GLId"))
        .Add(Restrictions.EqProperty(min, "query.GLId"));
    
    return session.CreateCriteria<GL>("query")
        .Add(Subqueries.Exists(subquery))
        .List<GL>();