从 hibernate 6 中删除了 registerFunction

问题描述 投票:0回答:1

我们正在从 springboot 2 迁移到 3,其中包括 hibernate 5 到 6 迁移

public class ExtendSqlServer2012Dialect extends SqlServer2012Dialect{
    public ExtendSqlServer2012Dialect(){
        registerFunction("datediffhr", new SQLFunctionemplate(StandardBasicTypes.INTEGER,"datediff(hour,?1,?2)"));
        registerFunction("dateaddhr", new SQLFunctionemplate(StandardBasicTypes.TIMESTAMP,"dateaddhr(hour,0,?1)"));
    }
}
spring-boot hibernate migration hibernate-5.x hibernate-6.x
1个回答
0
投票

Dialect
现在实现了
FunctionContributor
。直接等价的是:

public class ExtendSqlServer2012Dialect extends SqlServerDialect{
    @Override
    public void contributeFunctions(FunctionContributions functionContributions) {
        super.contributeFunctions(functionContributions);
        SqmFunctionRegistry registry = functionContributions.getFunctionRegistry();
        TypeConfiguration types = functionContributions.getTypeConfiguration();

        registry.register("datediffhr", new PatternBasedSqmFunctionDescriptor(
                new PatternRenderer("datediff(hour,?1,?2)"),
                StandardArgumentsValidators.exactly(2),
                StandardFunctionReturnTypeResolvers.invariant(
                        types.getBasicTypeForJavaType(integer.class)
                ),
                StandardFunctionArgumentTypeResolvers.invariant(
                        FunctionParameterType.TEMPORAL,
                        FunctionParameterType.TEMPORAL
                ),
                "datediffhr",
                FunctionKind.NORMAL,
                null
        ));
    }
}

您可能会发现

registry.registerNamed
更容易使用,或者您可能喜欢使用不同的
SqmFunctionDescriptor
子类。

您还可以使用通过 SPI 注册的独立

FunctionContributor
,而不是扩展
Dialect

© www.soinside.com 2019 - 2024. All rights reserved.