2010-02-04 145 views
1

我想重现HqlQuery风格'选择新的ObjectToProjectOut'功能。即获取从查询返回的列的列表,并返回为ObjectToProjectOut类型的列表,该列表使用具有与查询中的列一样多的参数的构造器实例化。NHibernate的投影使用SqlQuery

这实际上是'select new ObjectToProjectOut'在Hql中实现的......但显然这在SqlQuery中不可用。我想我需要设置一个结果转换并使用PassThroughResultTransformer,DistinctRootEntityResultTransformer等来使它工作。

任何人都知道我应该使用什么?

回答

2

确定....看NHibernate的代码后,似乎我一直在寻找AliasToBeanConstructorResultTransformer ....当然!

但是我可能发现了一个nHibernate的bug。如果你有两个不同的表(例如market.name和account.name)返回两次相同的列名,那么当nHibernate从db返回数组到变换器时,'Name'的第一次出现将被用于都。讨厌。

解决方法是唯一别名。使用Hql时,生成的sql是严重的别名,所以这只是SqlQuery的一个错误。

Grrrr。今天一定是我的一天,也发现了another nHibernate bug/issue I've posted to StackOverflow for comment.

1

您可以使用AddEntity方法从SQL查询中填充实体。

下面是从NHibernate docs两个例子:

sess.CreateSQLQuery("SELECT * FROM CATS") 
    .AddEntity(typeof(Cat)); 

sess.CreateSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS") 
    .AddEntity(typeof(Cat)); 
+0

没有抱歉,他们不是实体,他们是预测。 – penderi 2010-02-04 16:09:50