sql - 如何将 NHibernate 实体映射到查询

标签 sql nhibernate nhibernate-mapping hbm

我见过很多这样的例子,据我所知,我的 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>();

我明白了

Test method testThinAir threw exception: NHibernate.Exceptions.GenericADOException: could not execute query [ SELECT this_.JobId as JobId16_0_, this_.UserLogin as UserLogin16_0_, this_.UserEmail as UserEmail16_0_, this_.DateProcessed as DateProc4_16_0_ FROM ThinAir this_ ]

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

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

提前致谢。

迈克尔

最佳答案

实现此目的的一种方法是将映射从查询 移动到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

关于sql - 如何将 NHibernate 实体映射到查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20506975/

相关文章:

sql - 基于 Geo 参数查询的最佳方法是什么

database - NHibernate 多对一和唯一约束违规

c# - 使用 S#arp 架构的 NHibernate 验证本地化

java - 如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到具有复合键的另一个实体

c# - 我如何遍历 OracleDataReader 的所有列

mysql - 将行数添加为新列

MySQL 查询 - 从其他表中选择行数

nhibernate - NHibernate 中只读实体的背景

sql-server - NHibernate 加入子类

java - 如何在 Hibernate 中映射一组枚举类型?