小编典典

如何将NHibernate实体映射到查询

sql

我已经看到了许多这样的示例,据我所知,我的HBM文件遵循相同的模式,但是没有用。一,文件:

<?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”有效。也就是说,如果我打电话

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_
FROM ThinAir this_

我对这种现象的解释是NH忽略了我的<loader>标签,因此尝试从基础表中加载数据,默认情况下它假定命名为 ThinAir,
因为这是实体类的名称,仅 没有 任何 ThinAir 表,因此是错误消息。

这种解释正确吗?无论如何,我做错了什么,我该怎么做对呢?

提前致谢。

麦可


阅读 201

收藏
2021-04-14

共1个答案

小编典典

实现此目标的一种方法是将映射从 查询 移至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
2021-04-14