4

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

3 回答 3

5

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

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

COALESCE(:foo, foo) 

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

SET foo=foo

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

SET foo=:foo
于 2013-10-23T07:28:40.500 回答
4

请参阅@Define注释和 UseStringTemplate3StatementLocator 用法。

于 2013-10-08T13:07:09.273 回答
0

您可以编写如下查询:

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

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

于 2016-06-01T19:02:44.183 回答