Hibernate 6.0.0.Fine自定义方言不再起作用

wkftcu5l  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(257)

我使用的是带有如下定制方言的PostgreSQL 12和Hibernate5.6.8:

registerFunction("hstore_find",
    new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN, "(?1 -> ?2 = ?3)"));

当我尝试迁移到Hibernate6.0.0时,RegisterFunction和SQLFunctionTemplate不复存在。
我如何将这个注册表函数移植到Hibernate6的新方法?

gv8xihay

gv8xihay1#

在没有测试的情况下,我认为您需要在您的定制方言中使用以下内容:

@Override
public void initializeFunctionRegistry(QueryEngine queryEngine) {
    BasicTypeRegistry basicTypeRegistry = queryEngine.getTypeConfiguration().getBasicTypeRegistry();
    SqmFunctionRegistry functionRegistry = queryEngine.getSqmFunctionRegistry();
    functionRegistry.registerPattern(
            "hstore_find", 
            "(?1 -> ?2 = ?3)", 
            basicTypeRegistry.resolve( StandardBasicTypes.BOOLEAN ));
    // ...
}

可以仅用StandardBasicTypes.BOOLEAN替换basicTypeRegistry.resolve( StandardBasicTypes.BOOLEAN )

fsi0uk1n

fsi0uk1n2#

下面的代码对我很有效(Hibernate 6.1.1最终版)。但是,该函数是通过MetadataBuilderContributor(示例:https://stackoverflow.com/a/51285944)添加的。
此代码添加了PostgreSQL JSON函数@>

@Override
    public void contribute(MetadataBuilder metadataBuilder) {
        metadataBuilder.applySqlFunction(
                FIRST_JSON_VALUE_CONTAINS_THE_SECOND_FUNCTION,
                new PatternBasedSqmFunctionDescriptor(
                        new PatternRenderer("(?1 @> ?2)"),
                        null,
                        null,
                        null,
                        null,
                        FunctionKind.NORMAL,
                        null
                )
        );
    }

可能需要调整PatternBasedSqmFunctionDescriptor的参数,例如FunctionReturnTypeResolver参数。

相关问题