2010-06-03 63 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