2012-04-28 98 views
2

我有一个实体类,我用它来表示一个SQL查询的结果。下面显示的类的映射。然而,据我所知,禁止将映射视为存在真正的数据库表 - 事实上并不存在。在这种情况下,数据库中根本没有任何东西代表这个实体。我正在使用它来映射查询,但视图也是如此。是否没有办法指示nhibernate没有映射表示的表格?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> 
+1

如果你不想将你的类映射到数据库,那么......你为什么要映射它? :)只是完全删除映射,告诉nHib不映射它,这就是 – 2012-04-30 07:48:24

+0

由于问题说我想将它映射到查询的结果,如报告,所以单向(即数据库到应用程序)映射。对于nhibernate来说,认为把它当作不是双向映射的时候认为它是错误的。 – 2012-04-30 11:21:11

+0

看着另一个查询问题,我再次想到了你的问题。你实际上是在为SQL查询和DTO搜索一些ResultTransformer吗? http://relation.to/Bloggers/Hibernate32TransformersForHQLAndSQL#H-SQLTransformers – jbl 2012-05-02 15:49:39

回答

0

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

然后,你将能够:

+0

重要的不在于是否命名它,因为默认值是实体名称。否则你是正确的,这就是我所做的,但我的问题是,是否有任何方法可以告诉nhibernate它的单向映射(请参阅我对我的问题的评论),因为看起来nhibernate认为是错误的它的两种方式,当它不是。我在日志文件中看到它为它生成一个插入语句。最初它也生成了一个更新,但是通过设置mutable = false解决了这个问题,这个问题在似乎已被删除的答案中提出。 – 2012-04-30 11:23:25

+0

@DaleBurrell:你有没有试过把你的id映射变成一个带有列映射的简单属性,保持一个唯一的约束,用insert = false和update = false(并重复更新并为所有其他属性插入部分)? – jbl 2012-04-30 12:07:51

1

如果你甲肝在数据库视图中,您可以使用nhibernate映射到该视图,但如果您所做的只是存储查询的投影字段,则根本不需要是映射。

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

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

如果您使用linq提供程序,则可以直接将其投影到您的课程中。所以你必须从s这样的事情

在Session.Query 其中s.some属性==“一些价值” 选择新的类型 { 一些属性上,你的型= s.some属性, 一些,其他的属性上,你的型= s.some-其他属性 }

没有必要写一个映射到数据库中,因为你不是映射到数据库中的一个对象。

+0

好的,我已经编辑了我的问题,以表明我正在使用sql-query,如果没有映射,我无法使其工作,但也许这是我出错的地方? – 2012-04-30 20:56:00