2010-06-03 24 views
4

公式字段假设我有一个formula特性以下映射:排序方式NHibernate的

<class name="Planet" table="planets"> 
    <id name="Id" column="id"> 
     <generator class="native" /> 
    </id> 

    <!-- somefunc() is a native SQL function --> 
    <property name="Distance" formula="somefunc()" /> 
</class> 

我想获得由Distance计算财产所有行星,并命令他们:

var planets = session 
    .CreateCriteria<Planet>() 
    .AddOrder(Order.Asc("Distance")) 
    .List<Planet>(); 

这是翻译的以下查询:

SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY somefunc() 

所需的查询:

SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY formula0 

如果我设置的投影用别名,它工作正常:

var planets = session 
    .CreateCriteria<Planet>() 
    .SetProjection(Projections.Alias(Projections.Property("Distance"), "dist")) 
    .AddOrder(Order.Asc("dist")) 
    .List<Planet>(); 

SQL:

SELECT somefunc() as formula0 FROM planets ORDER BY formula0 

,但它在结果只填充距离属性和我真的很想避免手动投影我的对象的所有其他属性(可能有很多其他属性)。

NHibernate可以实现吗?作为奖励,我希望将参数传递给本机的SQL函数somefunc()。任何产生所需SQL的东西都是可以接受的(用子查询替换公式字段等),重要的是在结果对象中有计算出的距离属性,并按SQL中的这个距离排序。

+0

我只是用突起......还是你需要实际的行星进一步操纵? – dotjoe 2010-06-04 14:20:34

+0

是的,投影工作,但如果后来一个属性添加到对象,我将需要将其添加到预测也,如果我忘记它不会被分配。 – 2010-06-04 15:36:11

回答

4

这两个SQL在SQL中完全相同。为什么这有关系?

SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY somefunc() 
SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY formula0 

编辑,还是一样:

ORDER BY子句会简单地重复SELECT FUNC调用是否混淆或不

SELECT Id as id0, somefunc(1, 'fish') as formula0 FROM planets ORDER BY somefunc(1, 'fish') 
SELECT Id as id0, somefunc(1, 'fish') as formula0 FROM planets ORDER BY formula0 
+0

感谢您的提示,你是正确的,这些查询是100%相同。现在如何将参数传递给OrderBy子句中的函数,因为我的函数需要参数? – 2010-06-21 08:55:06

+0

@Darin Dimitrov:我会假设,当你在SELECT子句中传递参数给somefunc时,它们会以ORDER BY结尾。请参阅我的编辑。按不同的功能值排序是没有意义的,是吗? – gbn 2010-06-21 10:29:51