| Oracle® Fusion Middleware Oracle CQLデータ・カートリッジによるアプリケーションの開発 12c リリース(12.2.1.2.0) E82779-01 |
|
![]() 前へ |
![]() 次へ |
この章では、Oracle Continuous Query Language (CQL)の拡張機能であるOracle Javaデータ・カートリッジの使用方法を説明します。Oracle CQLを使用して、Oracle Stream AnalyticsアプリケーションでJavaクラスを操作するCQLコートを記述できます。
この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。
この章の内容は次のとおりです。
Oracle Javaデータ・カートリッジは、Oracle Stream AnalyticsアプリケーションでJavaクラスを操作するOracle CQL問合せおよびビューを記述できるようにする組込みカートリッジです。
この項では、次の内容について説明します。
Oracle Javaデータ・カートリッジでは、カートリッジID com.oracle.cep.cartrdiges.javaを使用します。
Oracle Javaデータ・カートリッジはデフォルトのOracle Stream Analyticsデータ・カートリッジです。
デフォルトのJavaパッケージ名配下の型またはjava.langシステム・パッケージ配下の型の場合、次のように、Oracle CQL問合せでパッケージ名またはデータ・カートリッジ名で修飾せずにそのJava型を参照できます。
<query id="q1"><
表6-1は、アプリケーション・クラス領域またはサーバー・クラス領域で実行されているかによって、2つの異なるアプリケーションがアクセスできるクラスをまとめています。
表6-1 クラスのロード・ポリシー別のクラス・アクセシビリティ
| クラス・ローディング・ポリシー | アプリケーションB1 | アプリケーションB2 |
|---|---|---|
アプリケーション・クラス・スペース |
|
|
サーバー・クラス・スペース |
|
|
アプリケーションB1では、Oracle CQL問合せでJavaクラスA、BおよびCのいずれも使用できます。
select A … select B … select C …
しかし、アプリケーションB2では、Oracle CQL問合せでJavaクラスAおよびBは使用できません。JavaクラスCおよびDのみ使用できます。
select C … select D …
JavaメソッドにアクセスするOracle CQL式は、次のアルゴリズムを使用してメソッドを解決します。
注意:
可変arityメソッドはサポートされていません。詳細は、Java言語仕様の第3版、12.12.2.4項を参照してください。
例として、次のOracle CQL式を考えてみます。
attribute.methodA(10)
attributeは、オーバーロードされた次のメソッドを定義する型mypackage.MyTypeです。
methodA(int)
methodA(Integer)
methodA(Object)
methodA(long)
リテラル10はプリミティブ型intであるため、優先順位は次のとおりです。
methodA(int)
methodA(long)
methodA(Integer)
methodA(Object)
詳細は、「クラスのロード」を参照してください。
Oracle Javaデータ・カートリッジは、Oracle CQLネイティブ・データ型とJavaデータ型間に固定算術マッピングを適用します。
表6-2 Oracle Javaデータ・カートリッジ: Oracle CQLからJavaデータ型へのマッピング
| Oracle CQLネイティブ・データ型 | Javaデータ型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表6-3 Oracle Javaデータ・カートリッジ: Javaデータ型からOracle CQLへのマッピング
| Javaデータ型 | Oracle CQLネイティブ・データ型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
他のすべてのJavaクラスは、複合型としてマップされます。
これらのデータ型マッピングの詳細は、次の項を参照してください。
Oracle CQLデータ型のCHARはjava.lang.Stringにマップされ、java.lang.StringはOracle CQLデータ型CHARにマップされます。すなわち、Oracle CQL CHARとして定義された属性のjava.lang.Stringメンバー・フィールドおよびメソッドにアクセスできます。たとえば、a1がOracle CQL CHAR型として宣言されている場合、次のような問合せを記述できます。
<query id="q1"><![CDATA[
select a1.substring(1,2)
></query>
Oracle CQL CHARリテラルであっても、リテラルのメンバー・フィールドおよびメソッドにはアクセスできません。たとえば、次のような問合せは使用できません。
<query id="q1-forbidden"><![CDATA[
select "hello".substring(1,2)
></query>
Javaの配列はOracle CQLデータ・カートリッジの配列に変換され、Oracle CQLデータ・カートリッジの配列はJavaの配列に変換されます。これは、複合型と単純型の両方に適用されます。
データ・カートリッジのTABLE句を使用して、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、「コレクション」を参照してください。
通常、Oracle Javaデータ・カートリッジはjava.util.Collectionインタフェースを実装するインスタンスをOracle CQL複合型に変換します。
Oracle CQL問合せは、java.util.Collectionのメンバーを介して繰り返すことができます。
データ・カートリッジのTABLE句を使用して、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、「配列」を参照してください。
Oracle Javaデータ・カートリッジ型は、SELECTおよびWHERE句内の式で使用できます。
Oracle Javaデータ・カートリッジ型は、ORDER BY句内の式では使用できません。
詳細は、「Oracle Javaデータ・カートリッジの使用」を参照してください。
この項では、Oracle Stream AnalyticsアプリケーションでのOracle Javaデータ・カートリッジの使用方法をまとめた共通のユース・ケースを説明します。次の内容が含まれます。
詳細は、「Oracle CQL問合せでのOracle Javaデータ・カートリッジのサポート」を参照してください。
この手順は、Javaクラス(Address.java)として定義されたイベント・プロパティ型を持つタプル(Student)として定義された1つのイベント・タイプを使用するOracle Stream Analyticsアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。
Javaクラスを使用して問合せするには:
この手順は、Javaクラス(Address.java)として定義されたイベント・プロパティ型を持つタプル(Student)として定義された1つのイベント・タイプを使用するOracle Stream Analyticsアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。この手順では、Address.javaクラスは別のOracle Stream Analyticsアプリケーションに属します。親アプリケーションでエクスポートされ、同じOracle Stream Analyticsサーバーにデプロイされた別のOracle Stream Analyticsアプリケーションにアクセス可能になります。
Javaクラスを使用して問合せするには:
JavaカートリッジではJavaキャスト関数が使用可能で、Java拡張可能型から別のJava拡張可能型へのキャストが可能です。ただし、キャスト元からキャスト先を割り当てることができる必要があります。この関数を使用するには、Javaカートリッジがインストールされている必要があります。
構文
T cast@java(l-value, class-literal<T>)
パラメータ
l-value: キャストするデータを持つイベント属性です。l-valueをTから割り当てることができない場合、Java Cartridgeはキャスト関数呼出し時にRuntimeInvocationExceptionをスローします。
class-literal<T>: キャスト先のクラス名です。たとえば、intをlongにキャストする場合、class-literal<T>はLong.classです。
例
次のクラス階層を考慮します。
public class Parent
{
...
}
public class Child extends Parent
{
...
}
次の例では、Child型のオブジェクトがキャストされます。
cast@java(S.parent, Child.class)