3

我正在使用带有 NHibernate 的自定义命名查询,我想返回一个 Person 对象的集合。Person 对象未使用 NHibernate 映射进行映射,这意味着我遇到了以下异常:

System.Collections.Generic.KeyNotFoundException:给定的键不在字典中。

它在创建 Session 时被抛出,因为它在调用 NHibernate.Cfg.Mappings.GetClass(String className) 时找不到类名。这一切都是可以理解的,但我想知道是否有任何方法可以告诉 NHibernate 使用该类,即使我没有它的映射?

4

5 回答 5

9

你为什么不使用:

query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));

它将使用列别名作为属性名称将查询中每一列的数据插入到 Person 对象属性中。

于 2009-03-19T15:37:07.703 回答
2

如何创建一个返回未映射类型实例的查询?

我认为 Michal 有一个观点,也许你应该看看预测。(至少,这是我认为你正在寻找的)。

您在某些映射类型上创建查询,然后,您可以将该查询“投影”到“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 知道它。

于 2009-03-19T15:44:23.490 回答
0

通过使用该类,NHibernate 基本上会猜测所涉及的所有内容,包括您打算为 Person 使用哪个表,以及字段映射。NHibernate 可能会被黑客入侵以基于匹配名称或其他内容进行动态绑定,但整个想法是使用 xml 文件创建从普通旧数据对象到数据库字段的映射。

于 2009-03-19T03:19:03.557 回答
0

如果没有很好的理由不映射该类,只需添加映射即可获得最佳结果...

也就是说,您不能使用命名查询将结果直接注入到未映射的类中。您需要告诉它哪些列放入哪些字段,或者换句话说,一个映射。;) 但是,您可以从命名查询返回标量值,并且您可以获取这些对象数组并手动构建您的集合。

于 2009-03-19T03:19:59.030 回答
0

为了解决这个问题,我最终使用了 TupleToPropertyResultTransformer 并提供了属性值列表。对此有一些限制,主要是 SQL 查询必须以与您向 TupleToPropertyResultTransformer 构造函数提供属性相同的顺序返回结果。

此外,属性类型是推断出来的,因此您需要小心仅返回整数值等的十进制列。除此之外,使用 TupleToPropertyResultTransformer 提供了一种相当简单的方法来使用 SQL 查询返回对象集合,而无需在 NHibernate 中显式映射对象.

于 2009-03-19T03:43:12.110 回答