2011-05-06 37 views
2

我有一个与NHibernate映射的类,我试图使用自定义的SQL查询加载。特别的是,它使用了一个复合身份证,但我希望这不是问题。NHibernate与自定义加载器映射不起作用

这里是映射的简化版本:

<class name="Person" mutable="false"> 
    <composite-id> 
    <key-property name="PropertyA" column="propA" type="int" /> 
    <key-property name="PropertyB" column="propB" type="string" /> 
    </composite-id> 
    <property name="PropertyC" column="propC" type="datetime" /> 
    <loader query-ref="loadPersons" /> 
</class> 
<sql-query name="loadPersons"> 
    <return class="PV" /> 
    <![CDATA[ 
    SELECT propA, propB, propC FROM MyPersons 
    ]]> 
</sql-query> 

的问题是,装载机被完全忽略。

SELECT this_.propA, this_.propB, this_.propC FROM Person this_ 

这显然导致错误:表或​​视图不存在(因为“人”只是我们干净名)发送到数据库的查询,就好像<loader>元素不会在那里被完全生成。

任何人都知道这是否与composite-id有关,或者是否有另一个原因,为什么loader会被忽略?

请注意,在返回数据时也可能有错误。我已经看到有一个特殊的别名语法,但我无法弄清楚之前,装载机实际上是做什么...

回答

2

我知道这是一个非常古老的问题,但我一直在寻找答案并提出了一些东西。您使用括号括起来的查询作为表格。这有点难看,但它适用于我:

<class name="Person" mutable="false" table="(SELECT propA, propB, propC FROM MyPersons)"> 
    <composite-id> 
    <key-property name="PropertyA" column="propA" type="int" /> 
    <key-property name="PropertyB" column="propB" type="string" /> 
    </composite-id> 
    <property name="PropertyC" column="propC" type="datetime" /> 
</class> 
+1

看起来不错。虽然没有测试过。我会接受... – Koen 2012-03-08 10:51:47