10 asd field_name1 10 asd field_name1 ? asd -6ren">
gpt4 book ai didi

java - 如何使用 JOOQ 检查 WHERE 子句条件是否有效?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:55 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

Shouldn't the following line throw an error instead of accepting it?

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

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

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

Is there a way to VALIDATE the condition grammar using JOOQ?

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

您可以这样使用它:

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

但正如我所说,截至 jOOQ 3.9,它是实验性的,仍然存在许多错误。 jOOQ 3.10 将取消其实验状态。

Furthermore unlike an addLimit, the values are not replaced with ?, why is that?

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

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

关于java - 如何使用 JOOQ 检查 WHERE 子句条件是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45328685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com