Java 如何在运行时使用JDBI'创建动态Sql查询;什么是Sql对象API?

Java 如何在运行时使用JDBI'创建动态Sql查询;什么是Sql对象API?,java,mysql,sql,jdbi,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")

我一直在将一个现有项目从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
);

请参阅annotation和UseStringTemplate3StatementLocator用法。

JDBI不太适合构造动态查询。在我看来,这个库的全部目的是尽可能地分离代码和SQL查询

但是,您的特殊情况可以通过SQL解决:

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

SET foo=foo
i、 它不会起任何作用(这是您的情况所需要的)。如果:foo不为null,则它将等效于

SET foo=:foo

您可以编写如下查询:


换句话说,如果列与条件匹配,则将其设置为变量,否则将其设置为自身(即不设置)。

这就是我最后要做的。我应该补充一点,您应该创建一个自定义@Binder对象来处理其他条件,即如果不是零,则更新。完美!这就给了我继续使用JDBI的理由。我已经研究了
@Define
@UseStringTemplate3StatementLocator
注释,我不知道它们中的任何一个或两个如何结合起来解决OP的问题。请你再详细解释一下,或者举个例子好吗?
UPDATE record SET
  foo = CASE WHEN :foo > 0 THEN :foo ELSE foo END
, bar = CASE WHEN :bar > 0 THEN :bar ELSE bar END
, baz = CASE WHEN :baz > 0 THEN :baz ELSE bar END
WHERE id = :id