2012-12-27 71 views
9

パラメータのセットに基づいて動的にJOOQ SELECTクエリを作成する必要があります。私はそれを動的に追加する方法を知らない。 助けてください動的にJOOQクエリを作成する

ありがとうございます。

+2

もう少し明確にすることはできますか?例えば。構築したいサンプルクエリを提供できますか?あなたは何を試しましたか、どこで失敗しましたか? –

+0

実際には私は選択クエリを作成する必要があります。渡されたパラメータに基づいてwhere節を更新する必要があります。 UIのように、いくつかのフィルタを渡していて、WHERE条件に動的に追加したいと思っています。 – user1900723

答えて

25

jOOQには、クエリを構築するための2種類のAPIがあります。

DSLのクエリオブジェクトの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:あなたのコメントを考えると、それはあなたが探しているものです:詳細情報については

// 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)); 

、:

// 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)メソッドを使用することができますあなたがもう少し明示することができますか?org.jooq.SelectQuery Javadoc

+0

しかしもう一つ質問があります。私は実行時にそれらの変数の値を入れることができるように、私はクエリ(特にaddConditionsの部分)でJava変数を使用できますか?たとえば。列名。 – user1900723

+0

@ user1900723:Javaの変数にこれらの要素を割り当てないようにするにはどうすればよいですか? –

+0

シナリオを説明しましょう。実際に私はテーブルで検索する必要があるいくつかの列があります。たとえば、名前、ID、日付などです。私はそれらに基づいてデータを取り出す必要があります。等号、始まり(オペレータのように使う必要があります)、終わり(オペレータのように使う必要があります)などの値を含むもう1つのパラメータがあります。私はすべてこれを動的に行う必要があります。だから、変数を使用して、値を飛ばせるようにする必要があります。それ以上の説明が必要な場合はお知らせください。私はここで立ち往生している。 – user1900723

関連する問題