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
相关产品推荐
相关产品推荐

