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

查看:104
本文介绍了为什么改变joinColumn的顺序,hibernate返回正确或不正确的查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

第一次加入:

  @OneToOne 
@JoinTable (name =TTR_POA_UPA,
joinColumn = {
@JoinColumn(name =ANO,insertable = false,updatable = false),
@JoinColumn(name =ID_ESCALA,insertable = false,updatable = false),
@JoinColumn(name =MES,insertable = false,updatable = false)
},
inverseJoinColumns = {
@JoinColumn =ANO,insertable = false,updatable = false),
@JoinColumn(name =ID_ESCALA,insertable = false,updatable = false),
@JoinColumn(name =MES,insertable = false,updatable = false)
}

private PoaUpa poaUpa;

返回:

 休眠:SELECT * FROM(选择autorizaci0_.ano如ano0_,autorizaci0_.ID_ESCALA如ID2_0_,autorizaci0_.mes如mes0_,autorizaci0_.AUTORIZACION_HORAS_DIA_FIJIS如AUTORIZA4_0_,autorizaci0_.AUTORIZACION_HORAS_EVENT如AUTORIZA5_0_,autorizaci0_.AUTORIZACION_HORAS_FACTP如AUTORIZA6_0_,autorizaci0_。 AUTORIZACION_HORAS_FIJIS为AUTORIZA7_0_,autorizaci0_.AUTORIZACION_HORAS_FIJOS为AUTORIZA8_0_,autorizaci0_.AUTORIZACION_HORAS_SEM_FACTP为AUTORIZA9_0_,autorizaci0_.AUTORIZACION_NAP为AUTORIZ10_0_,autorizaci0_.AUTORIZACION_NUM_PERS_EVENT为AUTORIZ11_0_,autorizaci0_.AUTORIZACION_OBSERVACIONES为AUTORIZ12_0_,autorizaci0_.PETICION_HORAS_DIA_FIJIS为PETICION13_0_,autorizaci0_.PETICION_HORAS_EVENT为PETICION14_0_,autorizaci0_.PETICION_HORAS_FACTP作为PETICION15_0_,autorizaci0_.PETICION_HORAS_FIJIS作为PETICION16_0_,autorizaci0_.PETICION_HORAS_FIJOS作为PETICION17_0_,autorizaci0_.PETICION_HORAS_SEM_FACTP作为PETI CION18_0_,autorizaci0_.PETICION_NAP为PETICION19_0_,autorizaci0_.PETICION_NUM_PERS_EVENT为PETICION20_0_,autorizaci0_.PETICION_OBSERVACIONES为PETICION21_0_,autorizaci0_.REALIZACION_HORAS_DIA_FIJIS为REALIZA22_0_,autorizaci0_.REALIZACION_HORAS_EVENT为REALIZA23_0_,autorizaci0_.REALIZACION_HORAS_FACTP为REALIZA24_0_,autorizaci0_.REALIZACION_HORAS_FIJIS为REALIZA25_0_,autorizaci0_.REALIZACION_HORAS_FIJOS为REALIZA26_0_, autorizaci0_.REALIZACION_HORAS_SEM_FACTP如REALIZA27_0_,autorizaci0_.REALIZACION_NAP如REALIZA28_0_,autorizaci0_.REALIZACION_NUM_PERS_EVENT如REALIZA29_0_,autorizaci0_.REALIZACION_OBSERVACIONES如REALIZA30_0_,autorizaci0_1_.ANO如ANO1_,autorizaci0_1_.ID_ESCALA如ID2_1_,autorizaci0_1_.MES如MES1_从TTR_AUTORIZACION autorizaci0_左外连接TTR_POA_UPA autorizaci0_1_上autorizaci0_.ano = autorizaci0_1_.ANO和autorizaci0_.ID_ESCALA = autorizaci0_1_.ID_ESCALA和autorizaci0_.mes = autorizaci0_1_.MES其中autorizaci0_.ano =?和autorizaci0_.mes =?和autorizaci0_.ID_ESCALA =? )其中rownum <=? 

使用此连接:

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

AND SECOND JOIN:

  @OneToOne 
@JoinTable(name =TTR_POA_UPA ,
@CoinColumn(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 =假)
})
私人PoaUpa poaUpa;

返回:

 休眠:SELECT * FROM(选择autorizaci0_.ano如ano0_,autorizaci0_.ID_ESCALA如ID2_0_,autorizaci0_.mes如mes0_,autorizaci0_.AUTORIZACION_HORAS_DIA_FIJIS如AUTORIZA4_0_,autorizaci0_.AUTORIZACION_HORAS_EVENT如AUTORIZA5_0_,autorizaci0_.AUTORIZACION_HORAS_FACTP如AUTORIZA6_0_,autorizaci0_。 AUTORIZACION_HORAS_FIJIS为AUTORIZA7_0_,autorizaci0_.AUTORIZACION_HORAS_FIJOS为AUTORIZA8_0_,autorizaci0_.AUTORIZACION_HORAS_SEM_FACTP为AUTORIZA9_0_,autorizaci0_.AUTORIZACION_NAP为AUTORIZ10_0_,autorizaci0_.AUTORIZACION_NUM_PERS_EVENT为AUTORIZ11_0_,autorizaci0_.AUTORIZACION_OBSERVACIONES为AUTORIZ12_0_,autorizaci0_.PETICION_HORAS_DIA_FIJIS为PETICION13_0_,autorizaci0_.PETICION_HORAS_EVENT为PETICION14_0_,autorizaci0_.PETICION_HORAS_FACTP作为PETICION15_0_,autorizaci0_.PETICION_HORAS_FIJIS作为PETICION16_0_,autorizaci0_.PETICION_HORAS_FIJOS作为PETICION17_0_,autorizaci0_.PETICION_HORAS_SEM_FACTP作为PETI CION18_0_,autorizaci0_.PETICION_NAP为PETICION19_0_,autorizaci0_.PETICION_NUM_PERS_EVENT为PETICION20_0_,autorizaci0_.PETICION_OBSERVACIONES为PETICION21_0_,autorizaci0_.REALIZACION_HORAS_DIA_FIJIS为REALIZA22_0_,autorizaci0_.REALIZACION_HORAS_EVENT为REALIZA23_0_,autorizaci0_.REALIZACION_HORAS_FACTP为REALIZA24_0_,autorizaci0_.REALIZACION_HORAS_FIJIS为REALIZA25_0_,autorizaci0_.REALIZACION_HORAS_FIJOS为REALIZA26_0_, autorizaci0_.REALIZACION_HORAS_SEM_FACTP如REALIZA27_0_,autorizaci0_.REALIZACION_NAP如REALIZA28_0_,autorizaci0_.REALIZACION_NUM_PERS_EVENT如REALIZA29_0_,autorizaci0_.REALIZACION_OBSERVACIONES如REALIZA30_0_,autorizaci0_1_.ID_ESCALA如ID2_1_,autorizaci0_1_.ANO如ANO1_,autorizaci0_1_.MES如MES1_从TTR_AUTORIZACION autorizaci0_左外连接TTR_POA_UPA autorizaci0_1_上autorizaci0_.ano = autorizaci0_1_.ID_ESCALA和autorizaci0_.ID_ESCALA = autorizaci0_1_.ANO和autorizaci0_.mes = autorizaci0_1_.MES其中autorizaci0_.ano =?和autorizaci0_.mes =?和autorizaci0_.ID_ESCALA =? )其中rownum <=? 

有了这个不正确的连接:



<$ p $在autorizaci0_.ano = autorizaci0_1_.ID_ESCALA和autorizaci0_.ID_ESCALA = autorizaci0_1_.ANO



上显示

解决方案:

完美的解决方案是:(谢谢@JB Nizet)

  @OneToOne 
@JoinTable(name =TTR_POA_UPA,
joinColumns = {
@JoinColumn( name =IDO,insertable = false,updatable = false,referencedColumnName =ID_ESCALA),
$ b @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;


解决方案

加入表格。它在第一种情况下意外地工作,因为构成实体ID的列的顺序与连接列的顺序相同。您应该指定每个连接列的引用列名称,以使事情更清晰和更安全:

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

具有连接表的OneToOne真的很奇怪,但是。


PROBLEM:

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

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)

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

这篇关于为什么改变joinColumn的顺序,hibernate返回正确或不正确的查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆