仅针对HQL查询中的指定映射获取数据

时间:2015-06-21 10:17:06

标签: java hibernate orm hql hibernate-mapping

我有hbm.xml个文件

    <hibernate-mapping>
      <class catalog="test_user" name="test.user" table="user">
        <id name="id" type="java.lang.Long">
          <column name="id"/>
          <generator class="identity"/>
        </id>
        <property name="name" type="string">
          <column length="200" name="name" unique="true"/>
        </property>

    <set fetch="join" inverse="true" lazy="true" name="education" table="user_education">
          <key>
            <column name="aid"/>
          </key>
          <one-to-many class="test.UserEducation"/>
        </set>
<set fetch="join" inverse="true" lazy="true" name="employment" table="user_employment">
          <key>
            <column name="aid"/>
          </key>
          <one-to-many class="test.UserEmployment"/>
        </set>
<set fetch="join" inverse="true" lazy="false" name="otherProfiles" table="user_other_profile">
          <key>
            <column name="aid"/>
          </key>
          <one-to-many class="test.OtherProfile"/>
        </set>
<set fetch="join" inverse="true" lazy="false" name="settings" table="user_setting">
          <key>
            <column name="aid"/>
          </key>
          <one-to-many class="test.Setting"/>
        </set>
<set fetch="join" inverse="true" lazy="false" name="images" table="user_images">
          <key>
            <column name="aid"/>
          </key>
          <one-to-many class="test.Images"/>
        </set>
 ..
..
...

许多表与用户关联我在这里使用fetch="join"  最大表格。 在其他查询中,我必须从其他几个相关表中获取数据,所以我做了 fetch="join"

我想执行任务

from user as u
left join fetch u.settings
where u.id=25

我的问题是,当我想从用户获取数据时,它始终从fetch="join"的所有关联表中获取数据。 我想知道如何只获取相关的连接数据。对于上述查询,当我们为多个表指定fetch="join"时,不应从其他表中获取来自用户和设置数据的数据。

1 个答案:

答案 0 :(得分:1)

你不应该使用fetch =&#34; join&#34;因为EAGER fetching can lead to Cartesian Products and it's not very efficient

您需要将这些关联设置为lazy="true",并且只能以查询为基础获取该关联:

from user as u
left join fetch u.settings
where u.id=25

这样,您只会获取用户及其设置,而无需连接获取其他关联。