2012-04-28 99 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