2016-05-15 49 views
5
List<MyTable> result = DSL.using(configuration()) 
       .select() 
       .from(MY_TABLE) 
       .where(MY_TABLE.ID1.equal(pk_id1)) 
         .and(MY_TABLE.ID2.equal(fk_id2)) 
         .and(MY_TABLE.ID3.equal(fk_id3)) 
       .orderBy(MY_TABLE.ID.asc()) 
       .limit(limit) 
       .fetchInto(MY_TABLE) 
       .map(mapper()); 

我嘗試寫一些代碼,讓我的查詢採取三種可選的id例如我想查詢最終是如何寫可選其中JOOQ條款

select * from my_table where ID1=5 and ID2=6 and ID3=7 .... etc 

然而,我也想了能夠排除任何的ID的

select * from my_table where ID2=6 and ID3=7 

select * from my_table where ID3=7 
選項

的問題,這是第一個「where」子句屬於ID之一,其餘的都是阿富汗國家發展戰略,所以如果我if語句做了一個和我刪除了那裏,然後我也只是留下

List<MyTable> result = DSL.using(configuration()) 
       .select() 
       .from(MY_TABLE) 
         .and(MY_TABLE.ID2.equal(fk_id2)) 
         .and(MY_TABLE.ID3.equal(fk_id3)) 
       .orderBy(MY_TABLE.ID.asc()) 
       .limit(limit) 
       .fetchInto(MY_TABLE) 
       .map(mapper()); 

它不會工作。

我試圖尋找類似where id = *的地方,其中*基本上沒有過濾器,但我找不到像這樣的東西。

回答

5

jOOQ使得編寫SQL感覺好像它是靜態的嵌入式SQL。但事實並非如此。每個jOOQ查詢都是由表達式樹組成的動態SQL查詢 - 您只是不會注意到它。

SelectWhereStep.where(Condition)方法採用Condition參數,您不必在WHERE子句中直接放置該參數。

Condition condition = DSL.trueCondition(); 
if (something) 
    condition = condition.and(MY_TABLE.ID1.equal(pk_id1)); 
if (somethingElse) 
    condition = condition.and(MY_TABLE.ID2.equal(fk_id2)); 
if (somethingOther) 
    condition = condition.and(MY_TABLE.ID3.equal(fk_id3)); 

您現在可以傳遞到您的查詢:您可以查詢之前建立它

List<MyTable> result = 
DSL.using(configuration()) 
    .select() 
    .from(MY_TABLE) 
    .where(condition) 
    .orderBy(MY_TABLE.ID.asc()) 
    .limit(limit) 
    .fetchInto(MY_TABLE) 
    .map(mapper()); 

也有DSL實用方法,如:

這也是這裏記錄的手冊中構建AND連接條件:http://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql/

+0

我想它,但出於某種原因trueCondition總是評估爲真,所以我的查詢只返回一切。是否有另一個條件使用? –

+1

@LukeXu:是的,這是trueCondition的目的...... :)你確定你將每個新條件分配給變量嗎?和()操作創建一個新條件。它不會修改左側 –

+0

啊好吧,這是有道理的,謝謝! –

2

你所要求的有時被稱爲「SQL」數字「通配符」,或者至少你可以在網上找到評論,如果你搜索的話。

SQL不允許你寫「其中id = *」代替,如果你需要你的DDL保持靜態,你可以通過做一系列檢查像

select * from table 
    where 
    (my_table.id1 >= fk_id1_low and my_table.id1 <= fk_id1_high) and 
    (my_table.id2 >= fk_id2_low and my_table.id2 <= fk_id2_high) and 
    (my_table.id3 >= fk_id3_low and my_table.id3 <= fk_id3_high) 

因此效仿,現在你逝去的共如果你想對id1進行匹配,你將把fk_id1_low和fk_id1_high設置爲你想要匹配的值。如果您不想與id1匹配,您將設置fk_id1_low爲最小可能值,並將fk_id1_high設置爲最大可能值。你必須考慮的一件事情是數據庫引擎如何處理生成的查詢,因爲可能會執行大量額外的工作。

使用JOOQ另一個可能的答案是從流暢的界面移開,以便您可以使用if..then條件部分構建查詢。