仅获取 HQL 查询中指定映射的数据
Fetching data only for specified mapping in HQL query
我有以下 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>
..
..
...
许多 table 与这里的用户关联 我正在使用 fetch="join"
最多 table 秒。
在其他查询中,我必须从其他一些相关的 table 中获取数据,所以我做了
fetch="join"
。
我要执行任务
from user as u
left join fetch u.settings
where u.id=25
我的问题是,当我想从用户获取数据时,它总是从所有关联的 table(其中 fetch="join"
)获取数据。
我想知道如何只获取相关的连接数据。对于上述查询,当我们为多个 table 指定 fetch="join"
时,仅应从用户和设置数据中获取数据,而不是从其他 table 中获取数据。
你不应该使用 fetch="join" 因为 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
这样,您将只获取用户及其设置,而不会加入获取其他关联。
我有以下 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>
..
..
...
许多 table 与这里的用户关联 我正在使用 fetch="join"
最多 table 秒。
在其他查询中,我必须从其他一些相关的 table 中获取数据,所以我做了
fetch="join"
。
我要执行任务
from user as u
left join fetch u.settings
where u.id=25
我的问题是,当我想从用户获取数据时,它总是从所有关联的 table(其中 fetch="join"
)获取数据。
我想知道如何只获取相关的连接数据。对于上述查询,当我们为多个 table 指定 fetch="join"
时,仅应从用户和设置数据中获取数据,而不是从其他 table 中获取数据。
你不应该使用 fetch="join" 因为 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
这样,您将只获取用户及其设置,而不会加入获取其他关联。