如何强制 Hibernate 在组件上使用左外连接进行命名查询?

Posted

技术标签:

【中文标题】如何强制 Hibernate 在组件上使用左外连接进行命名查询?【英文标题】:How to force Hibernate to use left outer join on a component for a named query? 【发布时间】:2014-10-12 13:11:07 【问题描述】:

我尝试强制 Hibernate 为我的 namedQuery 使用左外连接。不幸的是,尽管我明确告诉他使用左外连接,但它总是额外生成一个内连接。

我的命名查询:

<query name="ZugMultiSelectDTO.findById">
     SELECT DISTINCT NEW ZugMultiSelectDTO(e.id, e.bemerkungZug,e.mergeGesperrt,
                                                e.ankunftsZugDetails.besteller) 
      FROM ZugVersionEntity AS e
      LEFT OUTER JOIN e.ankunftsZugDetails.besteller
      WHERE e.id IN (:id)
</query>

我的mapping.xml: ....

<property name="bemerkungZug" column="LOZUV_BEMERK_ZUG" />
<id name="id" column="LOZUV_ID" type="long">
<property name="mergeGesperrt" column="LOZUV_MERGE_GESPERRT" type="int" />
<component name="ankunftsZugDetails" class="...ZugDetails">
    <many-to-one name="besteller" not-found="ignore" lazy="false" cascade="none"  fetch="join">
        <column name="LOZUV_AN_PTEVU_ID_BESTELLER" />
    </many-to-one> 
</component>

Hibernate 生成的 SQL: select distinct zugversion0_.lozuv_id as col_0_0_, zugversion0_.lozuv_bemerk_zug as col_1_0_, zugversion0_.lozuv_merge_gesperrt as col_2_0_, zugversion0_.lozuv_an_ptevu_id_besteller as col_3_0_ from @CISD.TLOZUV zugversion0_ left outer join @CISD.TPTEVU evuentity1_ on zugversion0_.lozuv_an_ptevu_id_besteller=evuentity1_.ptevu_id inner join @CISD.TPTEVU evuentity2_ on zugversion0_.lozuv_an_ptevu_id_besteller=evuentity2_.ptevu_id where zugversion0_.lozuv_id in (411441403011234325L)

【问题讨论】:

【参考方案1】:

根据http://docs.jboss.org/hibernate/ 第 14.3 节,您可以使用以下语法来

> from Cat as cat
>     inner join cat.mate as mate
>     left outer join cat.kittens as kitten
> 
> from Cat as cat left join cat.mate.kittens as kittens
> 
> from Formula form full join form.parameter param

或者您可以尝试以下方法:

在休眠配置文件中,将 use_outer_join 属性设置为 true。

【讨论】:

【参考方案2】:

使用组件是不可能的。休眠错误。

【讨论】:

以上是关于如何强制 Hibernate 在组件上使用左外连接进行命名查询?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate5-左外连接QBC实现方式

Hibernate HQL ③

Hibernate5-一对多双向关联-左外连接-HQL

Hibernate(十四):HQL查询

[原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)

Hibernate5-一对多双向关联-迫切左外连接-HQL