close

有時候Query太複雜時,使用NHibernate的Query會組到瘋掉,又不想用System.Data.SqlClient時,就可以用用NHibernate的SQLQuery,它可以直接輸入普通的Query,不過在輸出的資料型態上,需要指定成NHibernate的型態,不然會吐出錯誤訊息:
NHibernate.QueryException : Return types of SQL query were not specified

解決方法是指定型態,舉例如下:
假設計算部門的總獎金
ISQLQuery isq = sess.CreateSQLQuery("select sum(bonus) bonus from employee where dept = 'SI'");
IList list = isq.List();
if(list.Count > 0){
    Console.WriteLine(list[0]);
}
乍看之下,這樣子是沒問題的,語法在資料庫Run也可以找到資料,不過實際上,它就吐錯誤出來啦!
所以,在isq.List()之前,加上isq.AddScalar("bonus", NHibernateUtil.Double);
這樣就正常囉! ISQLQuery isq = sess.CreateSQLQuery("select sum(bonus) bonus from employee where dept = 'SI'");
isq.AddScalar("bonus", NHibernateUtil.Double);
IList list = isq.List();
if(list.Count > 0){
    Console.WriteLine(list[0]);
}


若想把整個搜尋出來的結果,也可以像IQuery一樣是產生Object的話,則需要指定Entity
ISQLQuery isq = sess.CreateSQLQuery("select a.*, b.* from a a left join b b");
isq.AddEntity("a", typeof(a));
isq.AddEntity("b", typeof(b));
List<Object[]> list = isq.List<Object[]>();
a a;
b b;
for(int i = 0; i < list.count; i++){
    a = (a)list[i][0];
    b = (b)list[i][0];
}


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 momokao 的頭像
    momokao

    momokao

    momokao 發表在 痞客邦 留言(0) 人氣()