NHibernate執行原始SQL程式碼的方法小結
在使用NHibernate過程中經常會使用到複雜的sql查詢,但是使用hql又比較麻煩的情況下,我們往往都會想到採用原始的sql來執行。但是如何利用NHibernate來執行sql呢?問題來了,在NHibernate中也有AdoTemplate的方法可以執行sql的,但是這裡要介紹的是另外一種方法:CreateSQLQuery。以下部分例子源自於網路。
Nhibernate中CreateSQLQuery用法例項:
涉及的表:
(其中ISession session = NHibernateHelper.GetCurrentSession();)
用法一(返回數值):
或int c = query.UniqueResult<int>;//使用此方法發現sql執行了兩次,故不推薦使用。
用法二(返回物件實體):
或
或
或
或
用法三(連表查詢):
以上是一種常見的用法,通過該例子,相信大家心裡也已經有個數了,也應該知道怎麼操作這個sql了:)
但是過程中難免會遇到些問題,比如:
例項二(問題說明):
我需要執行例如這條sql語句:
1. 如果使用session.CreateQuery方法執行的話,你可能會遇到這樣的錯誤:
錯誤:undefined alias or unknown mapping
2. 使用CreateSQLQuery方法執行:
錯誤:Return types of SQL query were not specified...
3. 使用CreateSQLQuery方法並指定返回欄位值的型別,即使用AddScalar方法指定欄位值型別:
錯誤:could not execute query...
注意:EmailType欄位對應資料庫的型別是int,這裡我就誤解為也應該對映為NHibernateUtil.Int32;
4. 解決問題:
把AddScalar方法的引數裡一個屬性改了一下:
注意:這裡我將EmailType的型別對映改為了NHibernateUtil.String,實際上是與返回結果的EmailType值型別保持一致就OK了。
好了,相信大家看了上面的例子,應該也有所感觸吧,最後,再次感謝文中引用的作者,感謝他們給他們的經驗的分享。
文中主要引自: