使用未映射类与NHibernate命名查询
-
20-08-2019 - |
题
我使用的是与NHibernate自定义命名查询,我要返回Person对象的集合。 Person对象不与NHibernate的映射,这意味着我发现了以下异常映射:
System.Collections.Generic.KeyNotFoundException: 给定的关键是不存在的 字典。
当会话被创建,因为它不能找到类名时,它调用NHibernate.Cfg.Mappings.GetClass(字符串的className),它变得异常。这是所有相当可以理解的,但我不知道是否有任何方式告诉NHibernate的使用类,即使我没有得到一个映射呢?
解决方案 5
要解决这个问题,我结束了使用的TupleToPropertyResultTransformer和提供的属性值的列表。有一些限制到这一点,最主要的是SQL查询必须返回结果以相同的顺序为您提供您的属性到TupleToPropertyResultTransformer构造。
同样的属性类型推断,所以你必须要小心十进制列从只返回整数值等。除了,使用TupleToPropertyResultTransformer提供给使用SQL查询返回的对象的集合,而不明确地映射一个相当简单的方法内NHibernate的对象。
其他提示
你为什么不使用:
query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));
它将使用柱别名作为一个属性名字插入来自每一列的数据在查询到Person对象属性。
您如何创建一个查询,其将返回未映射一个类型的实例?
我觉得米哈尔有一点这里,也许你应该看看预测。 (至少,这是我认为你正在寻找)。
您创建一些映射类型的查询,然后,你可以“项目”该查询到“DTO”。 为了做到这一点,你就必须“进口”你的Person类,因此,它是已知的NHibernate的,你将不得不使用使用ResultTransformer。
像这样:
ICriteria crit = session.CreateCriteria (typeof(Person));
// set some filter criteria
crit.SetProjection (Projections.ProjectionList()
.Add (Property("Name"), "Name")
.Add (Property( ... )
);
crit.SetResultTransformer(Transformers.AliasToBean(typeof(PersonView));
return crit.List<PersonView>();
但是,这仍然意味着你必须的进口中的类,以使得NHibernate的知道它。
通过使用类,NHibernate的将主要是猜测的一切涉及包括你的意思是使用人的表和字段映射。 NHibernate的或许可以被黑客攻破进行动态基于匹配的名称或者什么约束力,但整体思路是使用XML文件来创建从普通的旧数据对象映射到数据库字段。
如果有一个很好的理由不是不映射类,只需添加映射会给你最好的结果...
这是说,你不能使用一个命名查询,直接注入成果转化为未映射类。你需要告诉它的列投入哪些领域或者换句话说,一个映射。 ;)但是,你可以从一个命名查询返回标值,你可以采取这些对象数组和手动建立您的收藏
。