SpringBoot 3 扩展 PostgresSQL 方言

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

我们通过扩展 Postgres Dialect 和 registerFunctions 拥有自定义的 postgres 方言,但看起来 Spring Boot 3 不支持此功能。

在 Spring Boot 3 中实现此功能的替代方法有哪些。

public class GlobalPostgresDialect extends PostgreSQL10Dialect {

    public static final String STRING_AGG = "string_agg";
    public static final String STRING_AGG_ORDER_BY = "string_agg_order_by";
    public static final String STRING_AGG_DISTINCT = "string_agg_distinct";
    public static final String STRING_AGG_DISTINCT_ORDER_BY = "string_agg_distinct_order_by";
    public static final String ARRAY_AGG = "array_agg";
    public static final String ARRAY_AGG_DISTINCT = "array_agg_distinct";
    public static final String ARRAY_AGG_ORDER_BY = "array_agg_order_by";
    public static final String ARRAY_AGG_DISTINCT_ORDER_BY = "array_agg_distinct_order_by";
    public static final String COUNT_DISTINCT_5_ARGS = "count_distinct_5_args";

    public GlobalPostgresDialect() {
        super();
        registerFunction(STRING_AGG, new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(?1, ?2)"));
        registerFunction(STRING_AGG_ORDER_BY, new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(?1, ?2 order by ?3)"));
        registerFunction(STRING_AGG_DISTINCT, new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(distinct ?1, ?2)"));
        registerFunction(STRING_AGG_DISTINCT_ORDER_BY, new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(distinct ?1, ?2 order by ?3)"));
        registerFunction(ARRAY_AGG, new SQLFunctionTemplate(StandardBasicTypes.STRING, "array_agg(?1)"));
        registerFunction(ARRAY_AGG_DISTINCT, new SQLFunctionTemplate(StandardBasicTypes.STRING, "array_agg(distinct ?1)"));
        registerFunction(ARRAY_AGG_ORDER_BY, new SQLFunctionTemplate(StandardBasicTypes.STRING, "array_agg(?1 order by ?2)"));
        registerFunction(ARRAY_AGG_DISTINCT_ORDER_BY, new SQLFunctionTemplate(StandardBasicTypes.STRING, "array_agg(?1, ?2 order by ?2)"));
        registerFunction(COUNT_DISTINCT_5_ARGS, new SQLFunctionTemplate(LongType.INSTANCE, "count(distinct(?1, ?2, ?3, ?4, ?5))"));
    }
}
spring-boot hibernate spring-data-jpa spring-data
1个回答
0
投票
public class CustomSQLDialect extends PostgreSQLDialect {

@Override
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
    super.initializeFunctionRegistry(functionContributions);
    SqmFunctionRegistry functionRegistry = functionContributions.getFunctionRegistry();
    TypeConfiguration typeConfiguration = functionContributions.getTypeConfiguration();

    BasicTypeRegistry basicTypeRegistry = typeConfiguration.getBasicTypeRegistry();
    // Example
    functionRegistry.patternDescriptorBuilder( "radians", "(?1*acos(-1)/180)" )
            .setInvariantType(basicTypeRegistry.resolve(StandardBasicTypes.BOOLEAN))
            .setExactArgumentCount(1)
            .setParameterTypes(NUMERIC)
            .register();
}

}

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