320.9. 例


以下のサンプルでは、クエリーを実行し、結果を行の List として取得します。ここで、各行は Map<String, Object> であり、キーは列名です。

まず、サンプルに使用するテーブルを設定します。これは単体テストに基づいているため、Java で行います。

実行する SQL スクリプト createAndPopulateDatabase.sql は、次のようになります。

次に、ルートと SQL コンポーネントを設定します。SQL エンドポイントの前に direct エンドポイントを使用していることに注意してください。これにより、クライアントが長い sql: URI よりもはるかに使いやすい URI direct:simple を使用して、direct エンドポイントにエクスチェンジを送信できます。DataSource はレジストリーで検索されるため、標準の Spring XML を使用して DataSource を設定できることに注意してください。

次に、メッセージを direct エンドポイントに送信します。このエンドポイントは、データベースにクエリーを実行する SQL コンポーネントにメッセージをルーティングします。

次のように、Spring XML で DataSource を設定できます。

 <jee:jndi-lookup id="myDS" jndi-name="jdbc/myDataSource"/>

320.9.1. 名前付きパラメーターの使用

Camel 2.11 から利用可能

以下の特定のルートでは、projects テーブルからすべてのプロジェクトを取得します。SQL クエリーには、:#lic と :#min という 2 つの名前付きパラメーターがあることに注意してください。
Camel は、メッセージ本文またはメッセージヘッダーからこれらのパラメーターを検索します。上記の例では、2 つのヘッダーに定数値を設定していることに注意してください。
名前付きパラメーターの場合:

   from("direct:projects")
     .setHeader("lic", constant("ASF"))
     .setHeader("min", constant(123))
     .to("sql:select * from projects where license = :#lic and id > :#min order by id")

ただし、メッセージボディーが java.util.Map の場合、名前付きパラメーターは本文から取得されます。

   from("direct:projects")
     .to("sql:select * from projects where license = :#lic and id > :#min order by id")

320.9.2. 式パラメーターの使用

Camel 2.14 から利用可能

以下の特定のルートでは、データベースからすべてのプロジェクトを取得します。ライセンスを定義するためにエクスチェンジの本文を使用し、プロパティーの値を 2 番目のパラメーターとして使用します。

from("direct:projects")
  .setBody(constant("ASF"))
  .setProperty("min", constant(123))
  .to("sql:select * from projects where license = :#${body} and id > :#${property.min} order by id")

320.9.3. 動的な値での IN クエリーの使用

Camel 2.17 以降で利用可能

Camel 2.17 以降、SQL プロデューサーは、IN 値が動的に計算される IN ステートメントで SQL クエリーを使用できるようにします。たとえば、メッセージ本文やヘッダーなどから。

IN を使用するには、次のことが必要です。

  • パラメーター名の前に in: を追加します。
  • パラメーターの前後に ( ) を追加します。

例はこれをよりよく説明しています。次のクエリーが使用されます。

-- this is a comment
select *
from projects
where project in (:#in:names)
order by id

次の経路で:

from("direct:query")
    .to("sql:classpath:sql/selectProjectsIn.sql")
    .to("log:query")
    .to("mock:query");

次に、IN クエリーは、次のような動的な値を持つキー名を持つヘッダーを使用できます。

// use an array
template.requestBodyAndHeader("direct:query", "Hi there!", "names", new String[]{"Camel", "AMQ"});


// use a list
List<String> names = new ArrayList<String>();
names.add("Camel");
names.add("AMQ");

template.requestBodyAndHeader("direct:query", "Hi there!", "names", names);


// use a string separated values with comma
template.requestBodyAndHeader("direct:query", "Hi there!", "names", "Camel,AMQ");

クエリーは、外部化する代わりにエンドポイントで指定することもできます (外部化すると SQL クエリーの維持が容易になることに注意してください)。

from("direct:query")
    .to("sql:select * from projects where project in (:#in:names) order by id")
    .to("log:query")
    .to("mock:query");

 

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.