我有以下使用 jOOQ 的代码:
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 条件,'?'出于某种原因没有填写结果 SQL,尽管文档说我们可以传递绑定。
我从日志中得到的结果SQL:
select `connector`.* from `connector` where (`connector`.`status` <> 'DELETED' and (JSON_CONTAINS(vendor_data, '"?"', '$.id')))
我错过了什么?正确的做法是什么?
jOOQ 版本:3.12.1
普通 SQL 模板处理包括一个小型解析器,可防止修改字符串文字和注释,如手册中关于 普通 SQL 模板 的部分所述。这是需要的,因为字符串文字既不能在 JDBC 中也不能在任何服务器实现中包含绑定参数。
你有2个选择:
JSON
绑定值,例如JSON.json("\"" + id + "\"")
(确保正确转义 JSONJSON_QUOTE(CAST(? AS VARCHAR))
我看到你还在使用 jOOQ 3.12。我建议升级,因为更高版本的 jOOQ 已经实现了大量的 JSON 支持,您可以使用它们。