如何使用子查询作为NHibernate中的连接?

时间:2015-12-10 09:59:51

标签: c# mysql sql hibernate nhibernate

我有以下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 

}   

我想"转换"这与NHibernate一起使用Query(或QueryOver)

任何人都知道如何正确地做到这一点或者能指出我正确的方向吗?

修改

我得到了以下内容:

 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属性之外,它被拉出。

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

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

提前致谢。

1 个答案:

答案 0 :(得分:3)

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

如何解决的选项是:

1)创建特殊实体并将其映射到此视图:UPDATE tbl_Main INNER JOIN tbl_Import ON tbl_Main.CML_Vertragsnummer = tbl_Import.CML_Vertragsnummer SET tbl_Main.Kundennummer = tbl_Import.Kundennummer; 它可以是DB视图或使用subselect进行映射(请参阅Mapping native sql to Entity with NHibernate

2)使用带有CreateSQLQuery的本机SQL

因为NHibernate在Entity模型之上提供查询。即FROM始终来自映射。无法如上所述创建