java – 为什么更改joinColumn的顺序,hibernate返回正确或不正确的查询?
作者:互联网
问题:
为什么更改joinColumn的顺序,hibernate返回正确或不正确的查询?
第一次加入:
@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;
返回:
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 <= ?
有了这个加入:
on autorizaci0_.ano=autorizaci0_1_.ANO and autorizaci0_.ID_ESCALA=autorizaci0_1_.ID_ESCALA
和第二次加入:
@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;
返回:
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 <= ?
有了这个错误的连接:
on autorizaci0_.ano=autorizaci0_1_.ID_ESCALA and autorizaci0_.ID_ESCALA=autorizaci0_1_.ANO
解:
完美的解决方案是:(感谢@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;
解决方法:
连接表的连接列引用连接表中的列.它在第一种情况下偶然起作用,因为构成实体ID的列的顺序与连接列的顺序相同.您应该指定每个连接列的引用列名称,以使事情更清晰,更安全:
@JoinColumn(name="ID_ESCALA", insertable=false, updatable=false, referencedColumnName="ID_ASCALA"),
@JoinColumn(name="ANO", insertable=false, updatable=false, referencedColumnName="ANO"),
...
但是,带连接表的OneToOne真的很奇怪.
标签:hibernate-annotations,java,spring,hibernate,spring-annotations 来源: https://codeday.me/bug/20190902/1787570.html