我使用的是与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文件来创建从普通的旧数据对象映射到数据库字段。

如果有一个很好的理由不是不映射类,只需添加映射会给你最好的结果...

这是说,你不能使用一个命名查询,直接注入成果转化为未映射类。你需要告诉它的列投入哪些领域或者换句话说,一个映射。 ;)但是,你可以从一个命名查询返回标值,你可以采取这些对象数组和手动建立您的收藏

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top