简体   繁体   English

为什么更改joinColumn的顺序,hibernate返回正确或不正确的查询?

[英]Why changing the order of the joinColumn, hibernate return a correct or incorrect query?

PROBLEM: 问题:

Why changing the order of the joinColumn, hibernate return a correct or incorrect query? 为什么更改joinColumn的顺序,hibernate返回正确或不正确的查询?

FIRST JOIN: 第一次加入:

@OneToOne
      @JoinTable(name="TTR_POA_UPA",
        joinColumns = {
          @JoinColumn(name="ANO", insertable=false, updatable=false),
          @JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
          @JoinColumn(name="MES", insertable=false, updatable=false)          
        },
        inverseJoinColumns = {
          @JoinColumn(name="ANO", insertable=false, updatable=false),
          @JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
          @JoinColumn(name="MES", insertable=false, updatable=false)
        }     
      )
private PoaUpa poaUpa;

Return: 返回:

Hibernate: select * from ( select autorizaci0_.ano as ano0_, autorizaci0_.ID_ESCALA as ID2_0_, autorizaci0_.mes as mes0_, autorizaci0_.AUTORIZACION_HORAS_DIA_FIJIS as AUTORIZA4_0_, autorizaci0_.AUTORIZACION_HORAS_EVENT as AUTORIZA5_0_, autorizaci0_.AUTORIZACION_HORAS_FACTP as AUTORIZA6_0_, autorizaci0_.AUTORIZACION_HORAS_FIJIS as AUTORIZA7_0_, autorizaci0_.AUTORIZACION_HORAS_FIJOS as AUTORIZA8_0_, autorizaci0_.AUTORIZACION_HORAS_SEM_FACTP as AUTORIZA9_0_, autorizaci0_.AUTORIZACION_NAP as AUTORIZ10_0_, autorizaci0_.AUTORIZACION_NUM_PERS_EVENT as AUTORIZ11_0_, autorizaci0_.AUTORIZACION_OBSERVACIONES as AUTORIZ12_0_, autorizaci0_.PETICION_HORAS_DIA_FIJIS as PETICION13_0_, autorizaci0_.PETICION_HORAS_EVENT as PETICION14_0_, autorizaci0_.PETICION_HORAS_FACTP as PETICION15_0_, autorizaci0_.PETICION_HORAS_FIJIS as PETICION16_0_, autorizaci0_.PETICION_HORAS_FIJOS as PETICION17_0_, autorizaci0_.PETICION_HORAS_SEM_FACTP as PETICION18_0_, autorizaci0_.PETICION_NAP as PETICION19_0_, autorizaci0_.PETICION_NUM_PERS_EVENT as PETICION20_0_, autorizaci0_.PETICION_OBSERVACIONES as PETICION21_0_, autorizaci0_.REALIZACION_HORAS_DIA_FIJIS as REALIZA22_0_, autorizaci0_.REALIZACION_HORAS_EVENT as REALIZA23_0_, autorizaci0_.REALIZACION_HORAS_FACTP as REALIZA24_0_, autorizaci0_.REALIZACION_HORAS_FIJIS as REALIZA25_0_, autorizaci0_.REALIZACION_HORAS_FIJOS as REALIZA26_0_, autorizaci0_.REALIZACION_HORAS_SEM_FACTP as REALIZA27_0_, autorizaci0_.REALIZACION_NAP as REALIZA28_0_, autorizaci0_.REALIZACION_NUM_PERS_EVENT as REALIZA29_0_, autorizaci0_.REALIZACION_OBSERVACIONES as REALIZA30_0_, autorizaci0_1_.ANO as ANO1_, autorizaci0_1_.ID_ESCALA as ID2_1_, autorizaci0_1_.MES as MES1_ from TTR_AUTORIZACION autorizaci0_ left outer join TTR_POA_UPA autorizaci0_1_ on autorizaci0_.ano=autorizaci0_1_.ANO and autorizaci0_.ID_ESCALA=autorizaci0_1_.ID_ESCALA and autorizaci0_.mes=autorizaci0_1_.MES where autorizaci0_.ano=? and autorizaci0_.mes=? and autorizaci0_.ID_ESCALA=? ) where rownum <= ?

With this join: 有了这个加入:

on autorizaci0_.ano=autorizaci0_1_.ANO and autorizaci0_.ID_ESCALA=autorizaci0_1_.ID_ESCALA

AND SECOND JOIN: 和第二次加入:

@OneToOne     
      @JoinTable(name="TTR_POA_UPA",
        joinColumns = {
          @JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
          @JoinColumn(name="ANO", insertable=false, updatable=false),
          @JoinColumn(name="MES", insertable=false, updatable=false)          
        },
        inverseJoinColumns = {
          @JoinColumn(name="ID_ESCALA", insertable=false, updatable=false),
          @JoinColumn(name="ANO", insertable=false, updatable=false),
          @JoinColumn(name="MES", insertable=false, updatable=false)
        }         )     
private PoaUpa poaUpa;

Return: 返回:

Hibernate: select * from ( select autorizaci0_.ano as ano0_, autorizaci0_.ID_ESCALA as ID2_0_, autorizaci0_.mes as mes0_, autorizaci0_.AUTORIZACION_HORAS_DIA_FIJIS as AUTORIZA4_0_, autorizaci0_.AUTORIZACION_HORAS_EVENT as AUTORIZA5_0_, autorizaci0_.AUTORIZACION_HORAS_FACTP as AUTORIZA6_0_, autorizaci0_.AUTORIZACION_HORAS_FIJIS as AUTORIZA7_0_, autorizaci0_.AUTORIZACION_HORAS_FIJOS as AUTORIZA8_0_, autorizaci0_.AUTORIZACION_HORAS_SEM_FACTP as AUTORIZA9_0_, autorizaci0_.AUTORIZACION_NAP as AUTORIZ10_0_, autorizaci0_.AUTORIZACION_NUM_PERS_EVENT as AUTORIZ11_0_, autorizaci0_.AUTORIZACION_OBSERVACIONES as AUTORIZ12_0_, autorizaci0_.PETICION_HORAS_DIA_FIJIS as PETICION13_0_, autorizaci0_.PETICION_HORAS_EVENT as PETICION14_0_, autorizaci0_.PETICION_HORAS_FACTP as PETICION15_0_, autorizaci0_.PETICION_HORAS_FIJIS as PETICION16_0_, autorizaci0_.PETICION_HORAS_FIJOS as PETICION17_0_, autorizaci0_.PETICION_HORAS_SEM_FACTP as PETICION18_0_, autorizaci0_.PETICION_NAP as PETICION19_0_, autorizaci0_.PETICION_NUM_PERS_EVENT as PETICION20_0_, autorizaci0_.PETICION_OBSERVACIONES as PETICION21_0_, autorizaci0_.REALIZACION_HORAS_DIA_FIJIS as REALIZA22_0_, autorizaci0_.REALIZACION_HORAS_EVENT as REALIZA23_0_, autorizaci0_.REALIZACION_HORAS_FACTP as REALIZA24_0_, autorizaci0_.REALIZACION_HORAS_FIJIS as REALIZA25_0_, autorizaci0_.REALIZACION_HORAS_FIJOS as REALIZA26_0_, autorizaci0_.REALIZACION_HORAS_SEM_FACTP as REALIZA27_0_, autorizaci0_.REALIZACION_NAP as REALIZA28_0_, autorizaci0_.REALIZACION_NUM_PERS_EVENT as REALIZA29_0_, autorizaci0_.REALIZACION_OBSERVACIONES as REALIZA30_0_, autorizaci0_1_.ID_ESCALA as ID2_1_, autorizaci0_1_.ANO as ANO1_, autorizaci0_1_.MES as MES1_ from TTR_AUTORIZACION autorizaci0_ left outer join TTR_POA_UPA autorizaci0_1_ on autorizaci0_.ano=autorizaci0_1_.ID_ESCALA and autorizaci0_.ID_ESCALA=autorizaci0_1_.ANO and autorizaci0_.mes=autorizaci0_1_.MES where autorizaci0_.ano=? and autorizaci0_.mes=? and autorizaci0_.ID_ESCALA=? ) where rownum <= ?

With this incorrect join: 有了这个错误的连接:

on autorizaci0_.ano=autorizaci0_1_.ID_ESCALA and autorizaci0_.ID_ESCALA=autorizaci0_1_.ANO

SOLUTION: 解:

The solution that works perfect is: (thanks @JB Nizet) 完美的解决方案是:(感谢@JB Nizet)

@OneToOne
  @JoinTable(name="TTR_POA_UPA",
    joinColumns = {
      @JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"),
      @JoinColumn(name="ID_ESCALA", insertable=false, updatable=false, referencedColumnName="ID_ESCALA"),
      @JoinColumn(name="MES", insertable=false, updatable=false, referencedColumnName="MES")          
    },
    inverseJoinColumns = {
      @JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"),
      @JoinColumn(name="ID_ESCALA", insertable=false, updatable=false, referencedColumnName="ID_ESCALA"),
      @JoinColumn(name="MES", insertable=false, updatable=false, referencedColumnName="MES")
    }     
  )
private PoaUpa poaUpa;

The join columns of the join table reference columns from the joined tables. 连接表的连接列引用连接表中的列。 It works by accident in the first case because the order of the columns constituting the ID of the entity is the same as the order of the join columns. 它在第一种情况下偶然起作用,因为构成实体ID的列的顺序与连接列的顺序相同。 You should specify the referenced column name of each join column, to make things clearer and safer: 您应该指定每个连接列的引用列名称,以使事情更清晰,更安全:

@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false, referencedColumnName="ID_ASCALA"),
@JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"),
...

A OneToOne with a join table is really really strange, though. 但是,带连接表的OneToOne真的很奇怪。

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

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