2009-04-09 67 views
1

我需要从一个HQL查询NHibernate的NHibernate的:返回一个常量在HQL

SELECT new NDI.SomeQueryItem(user, account, " + someNumber + ") 
FROM NDI.SomeObject object 

我想要的东西,像上面返回一个常量。我已经试过这样:

SELECT new NDI.SomeQueryItem(user, account, :someNumber) 
FROM NDI.SomeObject object 

再后来:

.SetParameter("someNumber", 1).List<SomeQueryItem>(); 

但在第一种情况下,我得到一个“未定义别名或未知的映射1”。这是有道理的,因为它可能认为1是别名。

对于第二次,我得到'未定义的别名或未知的映射:someNumber',如果它从未设置参数,这又有意义。我不得不相信有一些方法可以做到这一点。

回答

2

请随时继续相信有办法做到这一点 - 但与HQL没有!

为什么你想要吗?如果您想将此属性的值更新为您指定的值,请在加载对象后执行此操作。或者,如果结果集与您的对象不完全匹配,您可以一直使用SQL查询(您仍然可以通过NHibernate会话进行查询)。但NHibernate的目的是将数据库中的内容映射到对象上,因此指定这样的手动覆盖是绝对不允许的。

+0

“NHibernate将数据库中的内容映射到对象上”公平点,问题是基于数据库外的值的此值,并且该项目的构造函数具有基于该值的逻辑。这几乎就像使用查询来传递信息。我不会在这个问题上争论正确或错误...... – 2009-04-09 16:09:16

1

听起来您的域对象和数据库模型之间存在(小的)断开连接。如何创建一个小的“DTO”对象来填补这个空白?

您的查询是否返回SomeQueryItemDTO(或任何您想调用它的名单)的列表,由于命名,您知道该列表不是您的域的真实部分。然后有一些函数来处理列表,并通过合并与数据库无关的数据来构建真正的SomeQueryItem对象列表。

如果您已经在使用存储库模式,这应该会更容易,因为所有丑陋的细节都隐藏在您的存储库中。