使用自定义加载程序的NHibernate映射不起作用

时间:2011-05-06 11:47:54

标签: sql nhibernate-mapping loader

我有一个用NHibernate映射的类,我正在尝试使用自定义的sql-query进行加载。特别之处在于它使用了复合id,但我希望这不是问题。

以下是映射的简化版本:

<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>

问题是加载器完全被忽略了。发送到数据库的查询完全生成,好像<loader>元素不在那里:

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

这显然会导致错误:表或​​视图不存在(因为'Person'只是我们干净的名字)。

任何人都知道这是否与composite-id有关,还是有另一个原因会忽略loader?

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

1 个答案:

答案 0 :(得分: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>