2012-12-27 212 views
9

我需要基於這組參數動態地創建一個JOOQ SELECT查詢。我不知道如何動態追加它。 請幫忙動態創建JOOQ查詢

在此先感謝。

+2

你能更清楚一點嗎?例如。你能提供一個你想構建的示例查詢嗎?你試過了什麼,你哪裏失敗了? –

+0

其實我需要創建選擇查詢;其中我需要根據傳遞的參數更新where子句。就像從用戶界面我傳遞一些過濾器,並希望動態地添加到我的WHERE條件。 – user1900723

回答

25

jOOQ有兩種類型的API來構造查詢。

你想在這裏做手冊中給出的代碼示例上通過getQuery()方法訪問「模型」 API

例如,任選地加入加入:

DSLContext create = DSL.using(configuration); 
SelectQuery query = create.selectQuery(); 
query.addFrom(AUTHOR); 

// Join books only under certain circumstances 
if (join) 
    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID)); 

Result<?> result = query.fetch(); 

或者,optinally添加條件/謂詞:

query.addConditions(BOOK.TITLE.like("%Java%")); 
query.addConditions(BOOK.LANGUAGE_CD.eq("en")); 

UPDATE:考慮您的意見,這就是你要找的內容:

// Retrieve search strings from your user input (just an example) 
String titleSearchString = userInput.get("TITLE"); 
String languageSearchString = userInput.get("LANGUAGE"); 
boolean lookingForTitles = titleSearchString != null; 
boolean lookingForLanguages = languageSearchString != null; 

// Add only those conditions that the user actually provided: 
if (lookingForTitles) 
    query.addConditions(BOOK.TITLE.like("%" + titleSearchString + "%")); 
else if (lookingForLanguages) 
    query.addConditions(BOOK.LANGUAGE_CD.eq(languageSearchString)); 

請注意,您還可以使用Field.compare(Comparator, Object)方法:

// Initialise your dynamic arguments 
Field<String> field = BOOK.TITLE; 
Comparator comparator = Comparator.LIKE; 
String value = "%" + titleSearchString + "%"; 

// Pass them to the field.compare() method 
query.addConditions(field.compare(comparator, value)); 

欲瞭解更多信息,考慮org.jooq.SelectQuery Javadoc

+0

但我還有一個問題。我可以在查詢中使用java變量(特別是在addConditions部分中),以便我可以在運行時將這些變量的值。例如。列名稱。 – user1900723

+0

@ user1900723:什麼讓你不能將這些元素分配給Java中的變量? –

+0

讓我來解釋一下這個場景。其實我有一些列,我必須在表格中搜索。例如:名稱,ID,日期。我需要根據它們獲取數據,並且有另一個參數,其中包含像EQUAL TO,BEGINS WITH(需要使用像運算符),ENDS WITH(需要使用像運算符一樣)的值。我需要動態地做這一切。所以,需要使用變量,以便我可以把值放在一邊。如果您需要進一步澄清,請告訴我。我被困在這裏。 – user1900723