1. 程式人生 > >NHibernate執行原始SQL程式碼的方法小結

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了

好了,相信大家看了上面的例子,應該也有所感觸吧,最後,再次感謝文中引用的作者,感謝他們給他們的經驗的分享。

文中主要引自: