如何使用JOOQ检查WHERE子句条件是否为VALID?

时间:2017-07-26 13:39:39

标签: java sql parsing jooq

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

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

以下行是否应该抛出错误而不是接受错误?

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

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

1 个答案:

答案 0 :(得分: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));