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

jOOQ中DSL.condition()无法绑定参数值的问题排查

jOOQ 3.12.1中DSL.condition绑定参数失效问题解决

你使用jOOQ 3.12.1编写了如下Java代码,意图查询状态不为DELETED且vendor_data字段包含指定id的记录:

dslContext.select(CONNECTOR.asterisk())
    .from(CONNECTOR)
    .where(DSL.and(
        CONNECTOR.STATUS.notEqual(ConnectorStatus.DELETED.name()),
        DSL.condition("JSON_CONTAINS(vendor_data, '\"?\"', '$.id')", id)
    ))
    .fetchInto(Connector.class);

但运行后发现,原生SQL条件中的?并未被绑定的id参数替换,日志生成的SQL如下:

select `connector`.* from `connector` where (`connector`.`status` <> 'DELETED' and (JSON_CONTAINS(vendor_data, '"?"', '$.id')))

问题原因

你在SQL模板中将?放在了单引号包裹的字符串内部,jOOQ不会解析字符串常量里的占位符,因此参数无法被正确绑定。

正确实现方式

将占位符?从单引号中移出,让jOOQ自动处理参数的引号和转义逻辑,同时确保参数类型匹配JSON中的字符串格式:

dslContext.select(CONNECTOR.asterisk())
    .from(CONNECTOR)
    .where(DSL.and(
        CONNECTOR.STATUS.notEqual(ConnectorStatus.DELETED.name()),
        DSL.condition("JSON_CONTAINS(vendor_data, ?, '$.id')", DSL.val(id).cast(String.class))
    ))
    .fetchInto(Connector.class);

补充说明

  • 使用DSL.val(id).cast(String.class)是为了确保参数被转换为字符串类型,匹配JSON中id字段的字符串格式(JSON字符串需用双引号包裹)
  • jOOQ会自动为字符串参数添加引号并处理转义,无需手动在SQL模板中添加单引号或转义双引号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:00:05