我有这样的一个实体:School,保存了所属的地区ID。
目前我的NHibernate是这样配置的:
<property name="SchoolName" column="SchoolName"/>
<property name="DistrictID" column="DistrictID"/>
<property type="string" name="DistrictName" formula="(SELECT t.RegionName FROM CM_Region t WHERE t.ID = DistrictID)" />
所以在生成的语句时,会有子查询:
SELECT cmschool0_.ID AS ID67_1_,
cmschool0_.SchoolName AS SchoolName67_1_,
cmschool0_.DistrictID AS DistrictID67_1_,
(
SELECT t.RegionName
FROM CM_Region t
WHERE t.ID = cmschool0_.DistrictID
) AS formula82_1_,
FROM CM_School cmschool0_
这样,数据量大的时候,性能肯定不行的。而且我的表中有很多个这样的字段,个个都是这样子查询来显示的话,性能实在会有很大的影响。
所以,我想问一下,有没什么办法,可以直接设置NHibernate的映射,让生成的语句为
SELECT cs.ID,cs.SchoolName,cb.BasicDataName
FROM CM_School cs LEFT JOIN CM_BasicData cb ON cs.DistrictID=cb.ID
其中DistrictName直接映射到表CM_BasicData表中的BasicDataName?
这种情况在项目中很多,比如数据一般只保存更新人的ID,需要显示更新人的姓名的时候,如果是ADO.NET时,是直接通过SQL的LEFT JOIN进行查询显示。
这样的情况下,NHibernate如何处理呢?
是通过many-to-one吗?有没有更好的办法以实现像ADO.NET中的LEFT JOIN方式呢?
谢谢!
School与地区是many-to-one关系,对象设计好,Mapping使用many-to-one
many-to-one是不是整个表字段都被取出来了啊,要是只要得到一个字段呢。
例如,一个人(person)的地址(address)信息可以被映射到单独的表中(并保留所有属性的值类型语义):
<class name="Person" table="PERSON"> <id name="id" column="PERSON_ID">...</id> <join table="ADDRESS"> <key column="ADDRESS_ID"/> <property name="address"/> <property name="zip"/> <property name="country"/> </join> .........