我已经看到了许多这样的示例,据我所知,我的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:无法执行查询
[选择this_.JobId作为JobId16_0_,this_.UserLogin作为UserLogin16_0_,this_.UserEmail作为UserEmail16_0_,this_.Date处理为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/