【问题标题】:How to check if a WHERE clause condition is VALID or not using JOOQ?如何使用 JOOQ 检查 WHERE 子句条件是否有效?
【发布时间】:2018-01-01 21:05:01
【问题描述】:

假设我们有一个如下所示的 SQL 片段:

String condition = "field_name > 10 asd field_name1 <= 20"

下面的行不应该抛出错误而不是接受它吗?

query.addConditions(DSL.condition(condition));

有没有办法使用 JOOQ 验证条件语法?此外,与 addLimit 不同的是,这些值不会被替换为?,这是为什么呢?

【问题讨论】:

    标签: java sql parsing jooq


    【解决方案1】:

    下面的行不应该抛出错误而不是接受它吗?

    为什么要这样做? DSL.condition(String)plain SQL API 的一部分,它允许您将任何 SQL 字符串片段传递给所需的 jOOQ 查询元素,包括:

    • 简单的 SQL 片段
    • 复杂的、特定于供应商的表达式
    • 语法错误,如果您愿意的话

    没有对您放入普通 SQL 片段的内容进行验证。数据库将最终验证查询。但是 jOOQ 不知道您的数据库中是否有一个 asd 运算符。

    有没有办法使用 JOOQ 验证条件语法?

    jOOQ 3.9 中有一个实验性的Parser API,可通过DSLContext.parser() 获得。它允许您解析 SQL 字符串并从中构造表达式树。在这种情况下,asd 确实是一个无法识别的令牌,并且会抛出异常。

    你可以这样使用它:

    Condition condition = 
        ctx.parser().parseCondition("field_name > 10 asd field_name1 <= 20");
    

    但正如我所说,从 jOOQ 3.9 开始,它是实验性的,仍然存在许多错误。 jOOQ 3.10 将移除其实验状态。

    此外,与 addLimit 不同的是,这些值不会被替换为 ?,这是为什么呢?

    因为这就是普通 SQL API 的工作方式。如果你想要绑定变量,你可以这样写:

    Condition condition = DSL.condition("field_name > ? asd field_name1 <= ?", 10, 20);
    

    或者:

    Condition condition = 
        DSL.condition("field_name > {0} asd field_name1 <= {1}", val(10), val(20));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多