NHibernate实例化类部分属性

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()}
       } ));
原文地址:https://www.cnblogs.com/lucika/p/4432209.html