我已经看到了许多这样的示例,据我所知,我的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 表,因此是错误消息。
<loader>
这种解释正确吗?无论如何,我做错了什么,我该怎么做对呢?
提前致谢。
麦可
实现此目标的一种方法是将映射从 查询 移至subselect:
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