代码之家  ›  专栏  ›  技术社区  ›  lomaxx

将未映射类与nhibernate命名查询一起使用

  •  3
  • lomaxx  · 技术社区  · 15 年前

    我正在使用一个名为nhibernate的自定义查询,我想返回一组Person对象。Person对象未使用nhibernate映射进行映射,这意味着我遇到以下异常:

    system.collections.generic.keynotFoundException: 给定的密钥不在 字典。

    创建会话时会抛出它,因为调用nhibernate.cfg.mappings.getclass(string class name)时找不到类名。这完全可以理解,但我想知道是否有任何方法可以告诉nhibernate使用这个类,即使我没有它的映射?

    5 回复  |  直到 15 年前
        1
  •  9
  •   Michał Piaskowski    15 年前

    为什么不使用:

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

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

        2
  •  2
  •   Frederik Gheysels    15 年前

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

    我认为迈克尔在这里有一个观点,也许你应该看看预测。(至少,这是我想你要找的)。

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

    但是,这仍然意味着你必须 import 让NHibernate知道。

        3
  •  0
  •   dnewcome    15 年前

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

        4
  •  0
  •   Stuart Childs    15 年前

    如果没有很好的理由不映射类,只需添加映射就可以得到最好的结果…

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

        5
  •  0
  •   lomaxx    15 年前

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

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