比方说,我们有一个SQL片段如下图所示:如何使用JOOQ检查WHERE子句条件是否有效?
String condition = "field_name > 10 asd field_name1 <= 20"
不宜以下行抛出一个错误,而不是接受它?
query.addConditions(DSL.condition(condition));
有没有办法使用JOOQ验证条件语法?此外,与addLimit不同,值不会被替换为?,为什么?
比方说,我们有一个SQL片段如下图所示:如何使用JOOQ检查WHERE子句条件是否有效?
String condition = "field_name > 10 asd field_name1 <= 20"
不宜以下行抛出一个错误,而不是接受它?
query.addConditions(DSL.condition(condition));
有没有办法使用JOOQ验证条件语法?此外,与addLimit不同,值不会被替换为?,为什么?
下面的代码不应该抛出错误而不是接受它吗?
为什么要呢? DSL.condition(String)
是plain SQL API的一部分,它允许你任意SQL字符串片段传递给你想要一个jOOQ查询元素,包括:
有没有验证你在普通的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));