如何使用 JDBI 的 Sql Object API 在运行时创建动态 Sql 查询?

Han*_*s Z 4 java mysql sql jdbi

我一直在将现有项目从 jdbc 转移到 jdbi,并且我一直在充分利用 jdbi 漂亮的 SQL 对象 API。我们正在使用 mysql。

虽然 SQL 对象 API 可以构造在编译时已知的已处理查询,但我找不到在运行时生成查询的方法。

具体来说,我希望能够做这样的事情:

@SqlUpdate(
  "UPDATE record SET "+
    @IfNotZero("foo") "foo=:foo" +
    @IfNotNull("bar") "bar=:bar" +
    @IfNotNull("baz") "baz=:baz" +
  "WHERE id=:id"
)
public abstract int updateRecord(
  @Bind("id") int id,
  @Bind("foo") int foo,
  @Bind("bar") String bar,
  @Bind("baz") String baz
);
Run Code Online (Sandbox Code Playgroud)

Dei*_*del 5

JDBI 不太适合构建动态查询。IMO 这个库的重点是尽可能地分离代码和 SQL 查询。

但是,您的特定情况可能会通过 SQL 解决:

COALESCE(:foo, foo) 
Run Code Online (Sandbox Code Playgroud)

如果 'foo' 是表中列的名称,并且 :foo 将解析为 NULL,那么 mysql SET 将有效

SET foo=foo
Run Code Online (Sandbox Code Playgroud)

即它什么都不做(在您的情况下这是理想的行为)。如果 :foo 不为空,则等价于

SET foo=:foo
Run Code Online (Sandbox Code Playgroud)