1

我正在尝试编写引用单词定义的 Hibernate 方言。

我试图覆盖 Dialect.quote 函数,但它是最终的并且不允许这样做。

目前 Hibernate 生成这个:
select ..., postingdef0_.definition as definition31_, ... from ...

我需要它是: select ..., postingdef0_."definition" as definition31_, ... from ...

请注意单词定义周围的引号。

我还尝试将定义注册为关键字( registerKeyword )但没有成功。

在更改客户端代码以添加反引号之前,我想在方言中解决此问题,这似乎是替代解决方案。

4

1 回答 1

1

via 中定义的单词Dialect.registerKeyword()将被传递给org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder.applyReservedWords(Set<String>)which 时什么也不做hibernate.auto_quote_keywordfalse默认)。

将其设置为 true 可能会解决问题,但在我的情况下,这定义了许多其他导致更多问题的关键字。

我的修复是新代码中的这段代码Dialect

@Override
public IdentifierHelper buildIdentifierHelper(
    IdentifierHelperBuilder builder,
    DatabaseMetaData dbMetaData
) throws SQLException {
    // Original code
    builder.applyIdentifierCasing( dbMetaData );
    
    // My code: Just define a few keywords which cause problems
    builder.setAutoQuoteKeywords(true); // Force quotes around keywords
    Set<String> sqlKeywords = ImmutableSet.<String>builder()
        .add("VALUE")
        .build();
    builder.setReservedWords(sqlKeywords);
    
    // Original code
    builder.setNameQualifierSupport( getNameQualifierSupport() );

    return builder.build();
}
于 2021-12-13T21:33:36.397 回答