我们正在从 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)"));
}
}
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
。