2017-07-26 123 views
3

比方说,我们有一个SQL片段如下图所示:如何使用JOOQ检查WHERE子句条件是否有效?

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

不宜以下行抛出一个错误,而不是接受它?

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

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

回答

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));