簡體   English   中英

如何使用JDBI的Sql Object API在運行時創建動態Sql查詢?

[英]How do I create a Dynamic Sql Query at runtime using JDBI's Sql Object API?

我一直在將現有項目從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
);

請參閱@Define annotation和UseStringTemplate3StatementLocator用法。

JDBI不太適合構建動態查詢。 IMO這個庫的重點是盡可能地分離代碼和SQL查詢。

但是,您的特定情況可能通過SQL解決:

COALESCE(:foo, foo) 

如果'foo'是表中列的名稱,並且:foo將解析為NULL,那么mysql SET將是有效的

SET foo=foo

即它什么都不做(在你的情況下,這是不可取的)。 如果:foo不為null,它將等效於

SET foo=:foo

您可以編寫如下查詢:

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

換句話說,如果列匹配條件,則將列設置為變量,否則將其設置為自身(即不設置它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM