简体   繁体   English

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

[英]How to force Hibernate to use left outer join on a component for a named query?

I try to force Hibernate to use a left outer join for my namedQuery. 我试图强迫Hibernate对我的namedQuery使用左外部联接。 Unfortunatally it always generates aditionally an inner join, despite me explicitly telling him to use a left outer join. 不幸的是,尽管我明确地告诉他使用左外部联接,但它总是会附加地产生内部联接。

My named query: 我的命名查询:

<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>

My mapping.xml: .... 我的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 generated 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) 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)

AS per http://docs.jboss.org/hibernate/ section 14.3, you could use the following syntax to 按照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

Or you can try the following: 或者,您可以尝试以下操作:

In the hibernate configuration file set the use_outer_join property to true. 在休眠配置文件中,将use_outer_join属性设置为true。

Its not possible with components. 它不可能与组件一起使用。 Hibernate Bug. 休眠错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM