You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JOOQ 3.19.28的Trino方言jsonbGetAttributeAsText生成无效SQL语法

JOOQ 3.19.28生成Trino兼容JSON查询的问题

我使用JOOQ 3.19.28,Trino通过以下步骤部署:

  • docker run --name trino -d -p 8080:8080 trinodb/trino
  • docker exec -it trino trino

问题复现代码

public static void main(String[] args) {
    Param<JSONB> theField = DSL.val(JSONB.jsonbOrNull("{}"));
    Field<String> atText = DSL.jsonbGetAttributeAsText(theField, "attText");
    SelectSelectStep<Record1<String>> select = DSL.select(atText);
    getAthenaJooqContext().attach(select);
    System.out.println(select.getSQL(ParamType.INLINED));
}

public static DSLContext getAthenaJooqContext() {
    return DSL.using(
            SQLDialect.TRINO,
            new Settings().withRenderFormatted(true));
}

生成的SQL及报错信息

运行代码后生成的SQL:

select (json_parse('{}')->>'attText')

在Trino容器中执行该查询时报错:

Query 20251126_161814_00002_vedep failed: line 1:25: mismatched input '->'. Expecting: '%', ')', '*', '+', ',', '-', '.', '/', 'AND', 'AT', 'FILTER', 'IGNORE', 'OR', 'OVER', 'RESPECT', '[', '||',
select (json_parse('{}')->>'attText')

问题分析及解决方案

这是JOOQ针对Trino方言的实现bug。Trino不支持PostgreSQL风格的->> JSON属性访问运算符,它的JSON字符串提取需要用json_extract_string()函数,或[]下标语法,而JOOQ的jsonbGetAttributeAsText方法错误地为Trino生成了PostgreSQL的语法。

临时解决方案

  1. 手动构造Trino兼容的查询字段,替代jsonbGetAttributeAsText:
// 使用json_extract_string函数
Field<String> atText = DSL.field("json_extract_string({0}, {1})", String.class, 
    theField, DSL.val("$.attText"));

或者使用下标语法:

Field<String> atText = DSL.field("{0}['{1}']", String.class, theField, "attText");
  1. 升级JOOQ到最新版本,检查是否已修复该Trino方言的JSON函数渲染问题。

  2. 自定义Trino方言扩展,重写jsonbGetAttributeAsText对应的SQL渲染逻辑,生成Trino兼容的语法。

内容的提问来源于stack exchange,提问作者piotrd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 23:42:40