2013-12-10 42 views
3

我見過很多這樣的例子,並且據我所知我的HBM文件遵循相同的模式,但它不工作。首先,文件:如何將NHibernate實體映射到查詢

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="ThinAir" mutable="false" lazy="true" > 
    <id name="JobId"> 
     <generator class="native" /> 
    </id> 
    <property name="UserLogin"/> 
    <property name="UserEmail"/> 
    <property name="DateProcessed"/> 
    <loader query-ref="myquery"/> 
    </class> 
    <sql-query name="myquery"> 
    <return class="ThinAir"> 
     <return-property name="JobID" column="JobId"/> 
     <return-property name="userLogin" column="UserLogin"/> 
     <return-property name="DateProcessed" column="DateProcessed"/> 
     <return-property name="userEmail" column="UserEmail"/> 
    </return> 
    <![CDATA[ 
    SELECT DISTINCT JobID, 
    userLogin, 
    DateProcessed, 
    useremail 
    FROM   dbo.someothertable 
    ]]> 
    </sql-query> 
</hibernate-mapping> 

「myquery」in-and-of-its,works。也就是說,如果我叫

var x = session.GetNamedQuery("myquery").List(); 

我得到ThinAir對象的正確的列表。

但是,當我試圖得到ThinAirs像這樣的列表:

var submissions = session.CreateCriteria<ThinAir>().List<ThinAir>(); 

我得到

試驗方法testThinAir拋出異常: NHibernate.Exceptions.GenericADOException:不能執行查詢 [SELECT this_.JobId作爲JobId16_0_,this_.UserLogin作爲UserLogin16_0_,this_.UserEmail作爲UserEmail16_0_,this_.DateProcessed作爲DateProc4_16_0_從ThinAir THIS_]

我對這一現象的解釋是,NH無視我的<loader>標籤等試圖從基礎表,默認情況下它假定被命名爲ThinAir加載數據,因爲這名實體類,只有不是任何ThinAir表,因此錯誤消息。

這種解釋是否正確?無論如何,我做錯了什麼,我該怎麼做對不對?

在此先感謝。

邁克爾

回答

3

一種方法如何實現這一目標,將是從查詢移動映射到subselect

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="ThinAir" mutable="false" lazy="true" > 

    <subselect> 
    <![CDATA[ 
    SELECT DISTINCT JobID, 
    userLogin, 
    DateProcessed, 
    useremail 
    FROM   dbo.someothertable 
    ]]> 
    </subselect> 

    ... // rest of the mapping 
+1

非常感謝你:這就像一個魅力,但我仍然不明白爲什麼我原來的方法沒有......這些東西到底在哪裏? – Michael

+0

很好,如果有幫助。是的,文件可能會好一點。但是,無論如何,NHiberante確實有驚人之處......這可能部分難以發現;)祝你好運 –