【问题标题】:Nhibernate wrapper queryNhibernate 包装器查询
【发布时间】:2012-02-15 06:32:41
【问题描述】:

我想在 Nhibernate 中实现以下功能,我有这样的 SQL 查询

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 中实现这一点?任何指针都会有所帮助。

【问题讨论】:

  • @gdoron 这有点不公平。这是一个完全有效的问题,我不会在 Google 上找到答案。 OP 我给了你一个 +1 来恢复平衡。
  • 所以谷歌这个session.CreateSqlQuery nhibernate
  • @Rippo。如果不显示类,您将无法获得如何将 sql 查询转换为 NHibernate 的答案。
  • @gdoron - 还是有点不公平,因为 OP 可能不知道 CreateSQlQuery 这个短语。如果没有这些知识,他们就不太可能知道怎么做。
  • @Rippo。我知道,但我无法回答这个问题!类、映射文件是什么?

标签: nhibernate fluent-nhibernate hibernate-criteria correlated-subquery


【解决方案1】:

@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(我认为*)来解决此问题,但我们需要查看您的类和映射。

【讨论】:

  • 嗨 Rippo,感谢您的回复,但在我的情况下,情况有点复杂。正如我在查询中提到的,我使用计数作为聚合,但它可以是计数以外的任何东西。内部查询将比我上一篇文章中发布的更复杂这也是出于报告目的,因此我们不想创建单独的 DTO...除了使用 HQL 之外,您还想到了任何其他解决方案吗?
  • 你看,你无法在没有上下文的情况下回答问题。 +1 虽然努力!
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多