首页新闻找找看学习计划

NHibernate如何用left join实现属性的映射?

0
悬赏园豆:100 [待解决问题]

我有这样的一个实体: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方式呢?

谢谢!

阳光沙滩海岸线的主页 阳光沙滩海岸线 | 初学一级 | 园豆:104
提问于:2010-11-24 15:51
< >
分享
所有回答(2)
0

School与地区是many-to-one关系,对象设计好,Mapping使用many-to-one

李永京 | 园豆:3114 (老鸟四级) | 2010-11-26 13:51
使用这些方式是可以,但我们的项目都已经到后期了,现在改这些改动有些大了。所以我只是想了解一下有没有更好的方式呢?
支持(0) 反对(0) 阳光沙滩海岸线 | 园豆:104 (初学一级) | 2010-11-27 15:23

many-to-one是不是整个表字段都被取出来了啊,要是只要得到一个字段呢。

支持(0) 反对(0) 不要理我 | 园豆:180 (初学一级) | 2013-10-29 12:10
1

例如,一个人(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>
.........
不要理我 | 园豆:180 (初学一级) | 2013-11-13 15:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册