[英]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.