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

jOOQ解析含chr(10)参数的listagg函数报错问题求助

jOOQ解析含chr(10)的LISTAGG查询报错问题

问题描述

在jOOQ中使用chr(10)作为LISTAGG函数的分隔符时,解析器抛出错误:String literal expected [*] chr(10),导致无法解析该SQL查询。

复现代码

public class ListaggReproducer {
    public static void main(String[] args) {
        // JDBC连接参数
        String url = "jdbc:oracle:thin:@localhost:1521:XE";
        String username = "TEST";
        String password = "TEST";

        // 含listagg和chr(10)分隔符的SQL查询
        String sql = "SELECT listagg(emp_name, chr(10)) WITHIN GROUP (ORDER BY column_name) AS result FROM employe";

        try (Connection conn = DriverManager.getConnection(url, username, password);
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {

            // 获取并打印结果
            while (rs.next()) {
                String result = rs.getString("result");
                System.out.println(result);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

预期与实际行为

  • 预期行为:jOOQ应成功解析包含chr(10)作为分隔符的LISTAGG查询,支持SQL语句的正确生成与执行。
  • 实际行为:源数据库方言为Oracle,目标为PostgreSQL,两个数据库本身均可正常解析chr(10),但jOOQ解析器无法识别该写法。

环境信息

  • jOOQ版本:3.19.6(开源版)
  • 数据库方言:Oracle转PostgreSQL

解决方案

1. 直接使用换行符字符串字面量

将chr(10)替换为字符串字面量'\n',Oracle和PostgreSQL均支持该写法,且jOOQ解析器可正确识别:

SELECT listagg(emp_name, '\n') WITHIN GROUP (ORDER BY column_name) AS result FROM employe

2. 使用jOOQ DSL API构建查询(推荐)

避免直接编写原生SQL,改用jOOQ的DSL API构建查询,jOOQ会自动处理方言差异:

import org.jooq.DSLContext;
import org.jooq.impl.DSL;
import static your.generated.tables.Employe.EMPLOYE; // 替换为实际生成的表类

// ... 省略JDBC连接代码
DSLContext dsl = DSL.using(conn, SQLDialect.ORACLE); // 源方言
String result = dsl.select(DSL.listAgg(EMPLOYE.EMP_NAME, DSL.chr(10))
                   .withinGroupOrderBy(EMPLOYE.COLUMN_NAME))
                   .from(EMPLOYE)
                   .fetchOneInto(String.class);

当需要转换到PostgreSQL方言时,jOOQ会自动生成兼容的语法,无需手动修改。

3. 自定义解析器规则(进阶)

如果必须使用原生SQL且保留chr(10)写法,可通过自定义jOOQ解析器规则,允许函数作为LISTAGG的分隔符参数。此方法配置复杂,仅推荐在特殊场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:03:27