oracle 如何影响Hibernate的表别名命名模式?

70gysomp  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(112)

更新到Hibernate 6后,创建表别名的行为似乎发生了变化。结果是一个Oracle错误“ORA-00911:无效字符”,因为某些标识符以下划线开头。
一点上下文:使用Kotlin,我们希望以安全的方式访问实体的某些字段,但Hibernate需要完全访问。因此,我们为客户端指定了一个 public 字段volumesPerHour,为Hibernate指定了一个 private 字段_volumesPerHour。但是,这些名称用于创建某些标识符;一个实体Shift的例子:

/* select s._volumesPerHour from Shift s where s.id = "1234-5678" */
select _1_0.id,… from shift s1_0 join volumes_per_hour _1_0 on s1_0.id=_1_0.shift_id where s1_0.id='1234-5678'

为了引用表shiftvolumes_per_hour,Hibernate创建了表别名s1_0_1_0。一个似乎是从表名派生的,另一个则是从 * 字段名 * 派生的。由于前导下划线在Oracle中是非法的,这会中断查询。
Hibernate 5中的命名模式不同,产生了shift0_volumespe0_。现在,使用org.hibernate.dialect.OracleDialect而不是org.hibernate.dialect.Oracle12cDialect(因为后者已被弃用)Hibernate会破坏Oracle。我能做些什么来防止它?

ctzwtxfj

ctzwtxfj1#

如果您的标识符以下划线开头,那么在Oracle中,您必须使用双引号标识符。
在Hibernate中,有一个选项hibernate.globally_quoted_identifiers,你可以设置为true,它将所有标识符都用双引号括起来。

相关问题