JOOQ 解析器问题(POSTGRES 到 H2 的翻译)

Posted

技术标签:

【中文标题】JOOQ 解析器问题(POSTGRES 到 H2 的翻译)【英文标题】:JOOQ Parser Issue (POSTGRES to H2 Translation) 【发布时间】:2021-12-11 08:40:30 【问题描述】:

我正在尝试使用 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: Unknown function: [1:21] SELECT SPLIT_PART ([]OPACKET_SC_EMAILADDRESSDECRYPTED , '@' , 2 ) FROM TEST MT*

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

【问题讨论】:

【参考方案1】:

我想出了如何启用“解析未知函数”,但是无法识别一些函数,如 date_diff 和 date_parse。有什么线索吗?

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

jOOQ ParseListener SPI 可用于向 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 商业版

【讨论】:

以上是关于JOOQ 解析器问题(POSTGRES 到 H2 的翻译)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 进行 JOOQ SQL 语法转换

使用 jOOQ UPserting 到 Postgres 表时返回更新的行数

带有jooq的postgres数组范围表示法

带有 h2 和 jooq 的 JdbcSQLSyntaxErrorException

Jooq Postgres JSON 查询

Jooq 无法找到 postgres 数据库的驱动程序