2010-02-04 142 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