NHibernate 为习惯SQL的开发者提供了接口,将查询的结果转变为持久化对象。虽然该方法不是很提倡。
GetCurrentSession().CreateSQLQuery(sql)
参数sql就是实际要执行的sql语句。
如果需要将结果转化为持久换对象,那需要提供对象类型。
GetCurrentSession().CreateSQLQuery.AddEntity()
但需要注意的是,该类型必须是NHibernate可持久化的对象,也就是该类型必须写在hbm.xml文件中。
同时,sql中必须提供类型中所必须的全部属性,实例化全部属性。假如,实体类中有3个属性,但sql只提供了小于3的字段(属性),会报错。
class Item{ public int Id{get;set;} public string Name{get;set;} public DateTime Birthday{get;set;} }
如果使用下面的sql会报错。sql中提供了2个字段,但是实体类中有3个属性。
GetCurrentSession().CreateSQLQuery("select Id,Name from Item").AddEntity(new Item().GetType())
很多情况下,我们需要初始化部分属性。如果将结果实例化,那需要重新设计一个可持久化的类。这样可能会增加很多小类,非常不灵活。
幸运的是NHibernate为我们提供了另外一个方法List,将结果转化为object[].
GetCurrentSession().CreateSQLQuery("select Id,Name from Item").List<object[]>() as List<object[]>;
进一步将List<object[]>转化为强类型。
List<object[]>.ConvertAll<Item>(new Converter<object[], Item>(
delegate(object[] a) {
return new Item(){Id =Convert.ToInt32(a[0]),Name=a[1].ToString()}
} ));