jOOQ 不绑定 DSL.condition() 中的值

问题描述 投票:0回答:1

我有以下使用 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

java spring-boot mariadb jooq
1个回答
0
投票

普通 SQL 模板处理包括一个小型解析器,可防止修改字符串文字和注释,如手册中关于 普通 SQL 模板 的部分所述。这是需要的,因为字符串文字既不能在 JDBC 中也不能在任何服务器实现中包含绑定参数。

你有2个选择:

  • 使用
    JSON
    绑定值,例如
    JSON.json("\"" + id + "\"")
    (确保正确转义 JSON
  • 在服务器上将绑定值转换为 JSON,例如
    JSON_QUOTE(CAST(? AS VARCHAR))

我看到你还在使用 jOOQ 3.12。我建议升级,因为更高版本的 jOOQ 已经实现了大量的 JSON 支持,您可以使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.