首页 > 解决方案 > JOOQ 解析器问题(POSTGRES 到 H2 的翻译)

问题描述

我正在尝试使用 Java 中的 jooq api 将 POSTGRES sql 转换为 H2。我是这个图书馆的新手。谁能告诉我我在这里做错了什么?这是我的代码:

Query query = DSL
    .using(SQLDialect.POSTGRES)
    .parser()
    .parseQuery("select split_part(some_field, '@', 2) from test");
String convertedQuery = DSL.using(SQLDialect.H2).render(query));

我正在使用 jooq 依赖版本 3.13.6 从https://www.jooq.org/translate/尝试时使用相同的 sql ,但我的代码抛出以下异常:

java.lang.Exception:未知函数:[1:21] SELECT SPLIT_PART ([ ]OPACKET_SC_EMAILADDRESSDECRYPTED, '@', 2) FROM TEST MT*

我想从代码中启用“解析未知函数”,我该如何实现?

标签: javaspring-bootrestjooq

解决方案


jOOQ ParseListenerSPI可用于向 jOOQ 的解析器添加新功能,例如在您的情况下:

Query query = configuration
    .derive(ParseListener.onParseCondition(ctx -> {
        if (ctx.parseFunctionNameIf("SPLIT_PART")) {
            ctx.parse('(');
            Field<?> f1 = ctx.parseField();
            ctx.parse(',');
            Field<?> f2 = ctx.parseField();
            ctx.parse(',');
            Field<?> f3 = ctx.parseField();
            ctx.parse(')');

            return ... // implement your emulation here
        }

        // Let the parser take over if we don't know the token
        return null;
    })
    .dsl()
    .parser()
    .parseQuery("select split_part(some_field, '@', 2) from tes");

此功能需要 jOOQ 3.15 商业版


推荐阅读