2

我有一个实体类,用于表示 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>
4

2 回答 2

1

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

你是如何查询这些数据的?

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

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

从 s 在 Session.Query where s.some-property== "some-value" select new your-type { some-property-on-your-type = s.some-property, some-other-property-on-your -type = s.some-other-property }

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

于 2012-04-30T15:18:21.220 回答
0

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

然后您将能够:

  • 将您的属性映射到您的视图/SQL 查询结果列
  • 将您的课程设置为 mutable="false"
  • 将您的查询声明为命名查询(请参阅:http ://ayende.com/blog/3948/nhibernate-mapping-named-queries-query-and-sql-query )
于 2012-04-30T11:02:31.423 回答