NHibernate使用单个查询获取分层数据

时间:2011-04-05 17:48:14

标签: nhibernate nhibernate-criteria

我在DB中有一个表,其中的列如下所示。

Id   Name     Publisher          ParentId
------------------------------------------    
100  Sample1  ExamplePublisher   NULL
200  Sample2  ExamplePubl3       100

NHibernate映射如下所示。

   <class name="PaperMaster">
        <composite-id>
            <key-property name="Id"></key-property>
            <key-property name="AreaId"></key-property>
        </composite-id>       
        <property name="Name"></property>
        <property name="Parent"></property>
        <property name="Publisher"></property>
        <property name="YearStarted"></property>
        <bag name="ChildCollection" table="PaperMaster" lazy="false" 
                  inverse="true">
            <key>
                <column name="Parent"></column>
                <column name="AreaId"></column>
            </key>
           <key column="Parent"></key>
            <one-to-many class="PaperMaster"></one-to-many>
        </bag>        
        <many-to-one name="ParentObject" column="Parent">
            <column name="Parent"></column>
            <column name="AreaId"></column>
        </many-to-one>        

    </class>

当我像下面那样查询NHIbernate时,我成功地获得了正确填充子集合的对象。

   IList<PaperMaster> allList = se.CreateQuery("select e from PaperMaster e join fetch
      e.ChildCollection where e.Id=100")
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .List<PaperMaster>();

我面临的问题是每个孩子都会运行一个查询来填充对象,这似乎非常昂贵。有没有办法简化这个?例如,在单个查询中,我应该能够获得完整的关系。

1 个答案:

答案 0 :(得分:1)

减少查询量的一种方法是在包映射上添加batch-size="25"

e.g。

 <bag name="ChildCollection" table="PaperMaster" lazy="false"
     batch-size="25" inverse="true">

这将大大减少查询量。