【问题标题】:How to use subquery as a join in NHibernate?如何在 NHibernate 中使用子查询作为连接?
【发布时间】:2015-12-10 09:59:50
【问题描述】:

我有以下 SQL 代码:

SELECT err.*,tmp.counted FROM sm_database.error err
LEFT JOIN (
    SELECT sme_Hash, COUNT(*) as counted FROM sm_database.error GROUP BY sme_Hash
) tmp
ON tmp.sme_Hash = err.sme_Hash
WHERE sme_Id = 197

上面会给我一个额外的计数列,应该设置到下面的我的 Count 属性中。

id 197 将是我将在方法中使用的参数。

我的班级名称是:

public class Error {

    public virtual int Count { get; set; }

    public virtual DateTime Date { get; set; }

    public virtual int Id { get; set; }

    public virtual string Hash { get; set; } 

    -----------------
    //more property's 

}   

我想用 Query(或 QueryOver)将它“转换”成 NHibernate

有人知道如何正确执行此操作,或者可以为我指明正确的方向吗?

编辑

我得到了以下内容:

 string query = @"SELECT err.* ,tmp.Count 
                      FROM sm_database.error err 
                      LEFT JOIN ( 
                      SELECT sme_Hash as Hash, COUNT(*) as Count FROM sm_database.error GROUP BY sme_Hash
                      ) tmp
                      ON tmp.Hash = err.sme_Hash
                      WHERE sme_Id = :id";

        var result = session.CreateSQLQuery(query)
                   .AddEntity(typeof(Error))

                  .SetParameter("id", id).List<Error>().SingleOrDefault();

它工作正常,除了 Count 属性之外的所有内容都被拉出。

我的错误类中的 Count 属性未映射,因为我们在数据库中没有列,因为我们在查询中计算了计数。

有没有办法在我的 Error.Count 属性中获取 tmp.Count 值?

提前致谢。

【问题讨论】:

    标签: c# mysql sql hibernate nhibernate


    【解决方案1】:

    没有简单的答案,也没有针对这种 SQL 结构的内置解决方案。

    如何绕过的选项是:

    1) 创建特殊实体并将其映射到此视图:"SELECT sme_Hash, COUNT(*) as counted FROM sm_database.error GROUP BY sme_Hash" 它可以是 DB 视图或带有子选择的映射(参见 Mapping native sql to Entity with NHibernate

    2) 在 CreateSQLQuery 中使用原生 SQL

    因为 NHibernate 在实体模型之上提供查询。 IE。 FROM 总是来自映射。没有办法像上面那样创建它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多