2009-04-09 103 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對象列表。

如果您已經在使用存儲庫模式,這應該會更容易,因爲所有醜陋的細節都隱藏在您的存儲庫中。