【问题标题】:NHibernate SQL Query mapping on Single Column Result单列结果上的 NHibernate SQL 查询映射
【发布时间】:2012-01-04 12:19:28
【问题描述】:

我有一个非常简单的问题,但找不到简单的答案。

我让 NHibernate 执行一个原始 SQL 查询,不幸的是它是从数据库中加载的(是的,我们将 SQL 查询存储在数据库中,这不是最好的设计,但请容忍我)。这意味着基本上我不知道查询将返回多少列。 我所知道的是,如果查询是单列,那么它就是我需要的,如果它是多列,那么我需要第一列,这很容易。

在我的代码中,我基本上有 3 个选项:

session.CreateSQLQuery(SQLString).List();
session.CreateSQLQuery(SQLString).List<object>();
session.CreateSQLQuery(SQLString).List<object[]>();

问题是,如果查询返回单列,List() 将返回 List&lt;int&gt;(或适当的类型,但在我的情况下应该是 int),或者如果我有多个列,则返回 List&lt;object[]&gt;()List&lt;object&gt; 也是如此,只是在这种情况下它不会返回 List&lt;int&gt;。 当然,尝试始终转换为 object[](第三个选项)并获取第一个元素是行不通的,因为 nHibernate 返回一个 int 并且不能转换为 object[]。

有没有办法强制 nHibernate 总是返回一个 object[],即使是在单列的情况下?如果没有,是否有一种简单的方法可以检查结果中的列数并采取相应措施?

谢谢!

【问题讨论】:

  • NHibernate DTO 可能会满足您的需求。除了列表
  • 如果你不知道你的查询会返回什么,那么你怎么知道如何处理结果,或者你是根据结果的形状来决定的?
  • 我知道我需要一个 int 列表(基本上是 ID)。如果查询返回 1 列,这将是我需要的,但如果它返回多列,则第一列将是我需要的。然后我将这个 ID 列表向上传递以进行处理...我不知道结果的类型,因为查询是由其他进程动态生成的(它基本上是一种动态过滤的形式)。

标签: nhibernate


【解决方案1】:

您应该看看 NHibernate 提供的开箱即用的不同结果转换器(当然您也可以自己编写)。

NHibernate.Transform.ToListResultTransformer 可能适合您的情况。 AFAIK,它将您的结果转换为 IList,其中每个条目再次包含一个 IList。

所以:

IList items = session
.CreateSQLQuery(query)
.SetResultTransformer(new NHibernate.Transform.ToListResultTransformer())
.List()

if(((Ilist)items[0]).Count == 1)
// just one columns
else
// more columns or zero

【讨论】:

  • 正是需要的,我实际上正在考虑编写自己的,但很高兴知道有一个预先打包的。谢谢!
猜你喜欢
  • 2011-06-13
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2017-05-13
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多