Hibernate CamelCaseToUnderscoresNamingStrategy错误地Map了具有大写单个尾随字符的列

wlsrxk51  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(321)

spring-boot 3.1.0 / Hibernate 6.2.2

#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
#spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy

字符串
您可以切换上述选项,但结果保持不变。(或者将其保留为默认的SpringImplicitNamingStrategy)
具有属性的实体:private issueD和DB列:issue_d被Map到目标为r1_0.issued的查询。
导致异常(浓缩):
ERROR: column r1_0.issued does not exist Hint: Perhaps you meant to reference the column "r1_0.issue_d".
所有其他色谱柱工作正常。
我找不到这方面的任何文件。有什么想法吗
同时,我将列/属性重命名为issued_at/issuedAt

x8goxv8g

x8goxv8g1#

我想答案就在CamelCaseToUnderscoresNamingStrategy的源代码中:

private Identifier apply(final Identifier name, final JdbcEnvironment jdbcEnvironment) {
    if ( name == null ) {
        return null;
    }
    StringBuilder builder = new StringBuilder( name.getText().replace( '.', '_' ) );
    for ( int i = 1; i < builder.length() - 1; i++ ) {
        if ( isUnderscoreRequired( builder.charAt( i - 1 ), builder.charAt( i ), builder.charAt( i + 1 ) ) ) {
            builder.insert( i++, '_' );
        }
    }
    return getIdentifier( builder.toString(), name.isQuoted(), jdbcEnvironment );
}

字符串
正如你所看到的,逻辑计算了除了最后一个字符之外的所有字符。只有当长度为2或更长时,标识符的部分才会用下划线分隔。
P.S.如果你想保留issueD的名字,你应该实现Hibernate的PhysicalNamingStrategy接口,并在你的application.properies中使用它。

相关问题