nhibernate:没有表的类映射

nhibernate:没有表的类映射,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个实体类,用于表示sql查询的结果。下面显示了类的映射。然而,据我所知,nhiberate将映射视为有一个真实的数据库表,而实际上没有。在这种情况下,数据库中根本没有表示此实体的内容。我用它来映射一个查询,但是视图也是如此。是否无法向nhibernate表明映射不表示表 <class name="Models.UserTransaction"> <!-- Defaults table name same as Entity even though table doesn’

我有一个实体类,用于表示sql查询的结果。下面显示了类的映射。然而,据我所知,nhiberate将映射视为有一个真实的数据库表,而实际上没有。在这种情况下,数据库中根本没有表示此实体的内容。我用它来映射一个查询,但是视图也是如此。是否无法向nhibernate表明映射不表示表

<class name="Models.UserTransaction"> <!-- Defaults table name same as Entity even though table doesn’t exist -->
  <id name="Id">
    <column name="Id" not-null="true" unique="true" />
    <generator class="native" />
  </id>
  <property name="TransType" />
  <property name="Date" />
  <property name="Amount" />
  <property name="Balance" />
</class>

这是我正在映射的查询,它使用用户定义的表。如果没有映射,我无法让它工作,即使我复制的示例看起来是

  <sql-query name="UserTransactions">
    <query-param name="userId" type="string" />
    <return class="Models.UserTransaction" alias="userTx">
      <return-property name="TransType" column="TransType" />
      <return-property name="Id" column="Id" />
      <return-property name="Date" column="TransDate" />
      <return-property name="Amount" column="Amount" />
      <return-property name="Balance" column="Balance" />
    </return>
    <![CDATA[
      SELECT userTx.[Type] as TransType, userTx.[Id] as Id, userTx.[Date] as TransDate, userTx.[Amount] as Amount, userTx.[Balance] as Balance
      FROM dbo.User_AccountStatement(:userId) userTx
    ]]>
  </sql-query>

我想您至少应该指定一个视图作为映射的表名。 视图应具有与查询相同的结果列(并希望返回查询可能返回的任何行)

然后您将能够:

  • 将属性映射到视图/SQL查询结果列
  • 将类设置为mutable=“false”
  • 将查询声明为命名查询(请参阅:)

如果您有db视图,可以使用nhibernate映射到该视图,但如果您所做的只是存储查询的投影字段,则根本不需要映射

您如何查询这些数据

如果您使用的是criteria API,则可以使用resultstransformer将返回的对象数组映射到类。类型必须与投影的类之间匹配

如果您使用的是linq提供程序,则可以直接投影到类中。所以你会有这样的东西

来自会话中的。查询 其中s.some-property==“some value” 选择新类型 { 类型上的某些属性=s.some-property, 类型上的某个其他属性=s.some-other-property }


无需编写到数据库的映射,因为您没有映射到数据库中的对象。

如果不想将类映射到数据库,则。。为什么要映射它?:)只需完全删除映射,告诉nHib不要映射它,这就是问题所在,我想将它映射到查询结果,比如报告,所以是单向(即数据库到应用程序)映射。nhibernate将其视为双向映射而不是双向映射,这似乎是错误的。查看另一个查询问题,我再次思考了您的问题。您实际上是在为SQL查询和DTO搜索一些结果转换器吗@我现在遇到了这个问题。使用单向映射非常有意义。ORM是一种对象关系映射器。这并不意味着支持插入、更新和删除。它是一种将关系数据映射到面向对象数据的工具。我真的希望NHibernate允许对查询结果进行只读/选择映射。我们需要从许多其他表加载数据,而对于我们的场景来说,创建一个视图来生成一个报告是过分的。是否命名它并不重要,因为默认值是实体名称。否则你是对的,这正是我所做的,但我的问题是,有没有办法告诉nhibernate这是一个单向映射(见我对我问题的评论),因为nhibernate认为它是双向的,而不是双向的,这似乎是错误的。我在日志文件中观察它为其生成insert语句的过程。最初,它还生成了一个更新,但通过设置mutable=false修复了这一问题,在一个似乎已被删除的答案中建议设置mutable=false。@DaleBurrell:您是否尝试过将id映射转换为具有列映射的简单属性,保持唯一约束,并使用insert=false和update=false(并为所有其他属性重复更新和插入部分)?好的,我编辑了我的问题以表明我使用的是sql查询,如果没有映射,我无法使其工作,但可能这就是我出错的地方?