如何在Nhiberante中直接调用sql语句和存储过程
其实在这里讨论这些问题有点违背Hibernate的本意了,如果大家项目中对调用Sql语句和存储比较需要的话,那么建议在项目规划阶段不要采用该框架。
在Nhibernate中要直接执行sql语句很容易的,Nhiernate中提供了CreateSQLQuery方法允许这么做,关于执行原生语句随便找个hibernate手册里面讲得很清楚的,这里就举个简单的例子。
采用Hql的代码如下:
string hql = "from Article a where a.Section.Id = :sectionId and a.DateOnline < :now and a.DateOffline > :now ";
IQuery q = base.NHSession.CreateQuery(hql);
q.SetInt32("sectionId", base.Section.Id);
q.SetDateTime("now", DateTime.Now);
q.SetMaxResults(number);
return q.List();
那么采用原生sql的代码如下:
string hql = "select {a.*} from cm_Article {a} where a.sectionId = :sectionId and a.DateOnline < :now and a.DateOffline > :now ";
Iquery q =base.NHSession.CreateSQLQuery(hql,"a",typeof(Cuyahoga.Modules.Articles.Article));
q.SetInt32("sectionId", base.Section.Id);
q.SetDateTime("now", DateTime.Now);
q.SetMaxResults(number);
return q.List();
注意:在使用原生sql是,在查询语句中必须声明别名。
关于在Nhibernate中使用存储过程,我做了个实验,好像用CreateSQLQuery方法不行,只能采用间接方法曲线救国了,需要使用存储过程的数据库处理中,直接引用session的Connection对象,然后向平时调用存储过程一样就行了。大致如下:
System.Data.SqlClient.SqlConnection conn = base.NHSession.Connection as System.Data.SqlClient.SqlConnection;

调用存储过程处理

conn.close();

浙公网安备 33010602011771号