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

时间:2013-09-05 17:52:01

标签: java mysql sql jdbi

我一直在将现有的项目从jdbc转移到jdbi,而且我一直在使用jdbi漂亮的SQL Object API。我们正在使用mysql。

虽然SQL Object 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
);

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

COALESCE(:foo, foo) 

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

SET foo=foo

即。它什么都不做(在你的情况下,这是不可取的)。如果:foo不为null,则等同于

SET foo=:foo

答案 2 :(得分: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

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