-1

我想实现NHibernate的以后的事,我有SQL查询这样NHibernate的包装查询

select 
    rs.firstname, rs.lastname, COUNT(rs.id) 
from 
    (select firstname, lastname, (select name from users where userid = '12345') as id 
    from person p) rs 
group by rs.firstname, rs.lastname 

我怎么能在NHibernate的实现这一目标?任何指针都会有帮助。

+0

@gdoron这有点不公平。这是一个完全有效的问题,我不会在Google上找到答案。 OP我已经给你一个+1来恢复平衡。 – Rippo 2012-02-15 09:03:55

+0

所以google这个'session.CreateSqlQuery nhibernate' – gdoron 2012-02-15 09:06:02

+0

@Rippo。你不能得到一个答案如何将SQL查询转换为NHibernate而不显示类。 – gdoron 2012-02-15 09:07:33

回答

2

@gdoron是部分正确的,你有两个选择,a)使用Session.CreateSqlQuery或者b)使用一个命名的查询,其中IMO可能是你最好的选择。

在你的XML映射: -

<sql-query name="GetNameAndCount"> 
<![CDATA[ 
select 
    rs.Firstname, rs.Lastname, COUNT(rs.id) CountOf 
from 
    (select firstname, lastname, (select name from users where userid = :id) as id 
    from person p) rs 
group by rs.firstname, rs.lastname 
]]> 
</sql-query> 

和中检索数据

var results = Session 
    .GetNamedQuery("GetNameAndCount") 
    .SetInt32("id", id) 
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(NameCountDto))); 

return results.List<NameCountDto>(); 

和你的DTO看起来像

class NameCountDto { 
    public virtual string Firstname { get; set;} 
    public virtual string Lastname { get; set;} 
    public virtual int CountOf { get; set;} 
} 

在查询中被警告的列名和你的财产名称案件必须匹配。

您也可能很有可能使用HQL,Criteria或QueryOver(我认为*)解决此问题,但我们需要查看您的类和映射。

+0

嗨Rippo, 感谢您的回复,但在我的情况下情况有点复杂。正如我在查询中提到的,我使用count作为聚合,但它可以是除count之外的任何其他值。内部查询将比我之前发布的内容更复杂此外,这是为了报告目的,所以我们不想创建单独的DTO ... 除了使用HQL之外,还有其他任何解决方案出现在您的脑海中吗? – TBone 2012-02-15 10:08:23

+0

你看,你无法回答没有上下文的问题。 +1虽然努力! – gdoron 2012-02-15 16:58:51

+0

大声笑你说得对,谢谢你的支持。 :) – Rippo 2012-02-15 17:43:29