複数のインターフェースのアノテーション付きメソッドを結合するには、もう 1 つのインターフェースを使用してそれらのインターフェースを拡張します。拡張用のインターフェースでのバインド時に、拡張される複数のインターフェースからの SQL ステートメントを含む 1 つの DB2® パッケージがワークベンチによって作成されます。
複数のインターフェースを拡張するには、extends キーワードを使用します。さらに @PureQueryInterface アノテーションを、拡張用のインターフェースに追加します。
また拡張用のインターフェースでは、アノテーション付きメソッドを宣言できます。この場合、拡張用のインターフェースに生成するインプリメンテーション・クラスには、拡張用のインターフェースで宣言されるアノテーション付きメソッドの定義のほかに、拡張されるインターフェースで宣言されるアノテーション付きメソッドの定義も含まれます。
例
以下のインターフェースがあるとします。
public interface SalesTeam {
@Select(sql="SELECT * FROM SALES")
List<SalesBean> getSalesEmployees();
}
public interface MarketingTeam {
@Select(sql="SELECT * FROM MARKETING")
List<MktBean> getMarketingEmployees();
}
これらのインターフェースの SQL ステートメントを別個の DB2 パッケージにバインドするとします。そのためには、以下のステップを実行します。
- SalesTeam および MarketingTeam を拡張するインターフェースを作成します。この例では、インターフェースは CombinedTeam という名前で、以下のようになります。
@PureQueryInterface
public interface CombinedTeam extends SalesTeam, MarketingTeam {
}
- @PureQueryInterface アノテーションを CombinedTeam インターフェースに追加します。
- CombinedTeam インターフェースを保存して、このインターフェースのインプリメンテーションを生成します。CombinedTeam のインプリメンテーションには、SalesTeam インターフェースおよび MarketingTeam インターフェース内で宣言されているメソッドが含まれます。これらのインターフェースには、同じアノテーション付きメソッドが含まれていてはなりません。
ワークベンチでは、SalesTeam インターフェースおよび MarketingTeam インターフェースのインプリメンテーションは生成されません。プロジェクト内にこれらのインターフェースのインプリメンテーション・クラスが含まれる場合、ワークベンチによってそれらのクラスが削除されることはありません。SalesTeam インターフェースまたは MarketingTeam インターフェースに変更を加えると、ワークベンチによって CombinedTeam インターフェースのインプリメンテーション・クラスが再生成されます。
想定される 6 つのシナリオ
これらのシナリオで、インターフェースの拡張、インターフェースからの拡張の削除、拡張用のインターフェースの削除を実行する際のワークベンチの動作を示します。
各シナリオには、「生成されたインプリメンテーションをユーザー・コードとして扱う」 チェック・ボックスを選択した場合と選択しなかった場合の動作が示されています。デフォルトでは、このチェック・ボックスは選択されています。この場合、ワークベンチによってインプリメンテーション・クラスが削除されることはありません。
このチェック・ボックスを表示するには、Java プロジェクトを右クリックし、「プロパティー」を選択します。「プロパティー」ウィンドウで、「pureQuery」を展開し、「プロパティー」を選択します。
これらのシナリオでは、以下のインターフェースを使用します。
- インターフェース A。このインターフェースでは、アノテーション付きメソッドを宣言していません。
- インターフェース B、Y、および Z。これらのインターフェースでは、アノテーション付きメソッドを宣言しています。
- シナリオ 1: アノテーション付きメソッドを宣言していないインターフェースを 1 つ使用して複数のインターフェースを拡張する
- ユーザーが実行すること
- インターフェース Y および Z を作成します。これらのインターフェースではアノテーション付きメソッドが宣言されます。
- インターフェース A を作成して、インターフェース Y および Z を拡張します。
- インプリメンテーション・クラスの保持を指定した場合のワークベンチの動作
- インターフェース Y および Z のインプリメンテーション・クラスが存在する場合、それらのクラスを保持します。これらのインターフェースのいずれかを変更すると、ワークベンチは対応するインプリメンテーション・クラスを保持します。
- インターフェース A のインプリメンテーション・クラスを生成します。このクラスは、インターフェース Y および Z で宣言されるアノテーション付きメソッドを定義します。
- インプリメンテーション・クラスの保持を指定しなかった場合のワークベンチの動作
- インターフェース Y および Z のインプリメンテーション・クラスが存在する場合、それらのクラスを削除します。これらのクラスに対して行われた編集内容はすべて失われます。
- インターフェース A のインプリメンテーション・クラスを生成します。このクラスは、インターフェース Y および Z で宣言されるアノテーション付きメソッドを定義します。
- シナリオ 2 アノテーション付きメソッドを宣言しているインターフェースを 1 つ使用して複数のインターフェースを拡張する
- ユーザーが実行すること
- インターフェース Y および Z を作成します。これらのインターフェースではアノテーション付きメソッドが宣言されます。
- インターフェース B を作成します。これにより、アノテーション付きメソッドを宣言し、インターフェース Y および Z を拡張します。
- インプリメンテーション・クラスの保持を指定した場合のワークベンチの動作
- インターフェース Y および Z のインプリメンテーション・クラスが存在する場合、それらのクラスを保持します。ただし、これらのインターフェースのいずれかを変更した場合、ワークベンチは対応するインプリメンテーション・クラスを削除します。
- インターフェース B のインプリメンテーション・クラスを生成します。このクラスは、インターフェース B、Y、および Z で宣言されるアノテーション付きメソッドを定義します。
- インプリメンテーション・クラスの保持を指定しなかった場合のワークベンチの動作
- インターフェース Y および Z のインプリメンテーション・クラスが存在する場合、それらのクラスを削除します。これらのクラスに対して行われた編集内容はすべて失われます。
- インターフェース B のインプリメンテーション・クラスを生成します。このクラスは、インターフェース Y および Z で宣言されるアノテーション付きメソッドを定義します。
- シナリオ 3 アノテーション付きメソッドを宣言していない 1 つのインターフェースからの複数のインターフェースの拡張を取り消す
- ユーザーが実行すること
- インターフェース A を編集して、インターフェース Y および Z の拡張を取り消すか、@PureQueryInterface アノテーションが含まれないようにします。
- インプリメンテーション・クラスの保持を指定した場合のワークベンチの動作
- インターフェース A のインプリメンテーション・クラスを保持します。
- インプリメンテーション・クラスの保持を指定しなかった場合のワークベンチの動作
- インターフェース A のインプリメンテーション・クラスを削除します。このインターフェースでは、アノテーション付きメソッドが宣言されていないためです。このクラスに対して行われた編集内容はすべて失われます。
どちらの場合でも、インターフェース Y および Z のインプリメンテーション・クラスをワークベンチで生成するには、以下のいずれかのステップを実行する必要があります。
- 「プロジェクト」を選択し、オプションの「自動的にビルド」が選択されていることを確認します。インターフェースを編集し、保存します。編集内容は、空白文字 1 つの追加などのわずかな変更で構いません。
- 「プロジェクト」 > 「クリーン」を選択し、プロジェクトをビルドします。
- シナリオ 4: アノテーション付きメソッドを宣言している 1 つのインターフェースからの複数のインターフェースの拡張を取り消す
- ユーザーが実行すること
- インターフェース B を編集して、インターフェース Y および Z の拡張を取り消すか、@PureQueryInterface アノテーションが含まれないようにします。
- ワークベンチの動作。インプリメンテーション・クラスの保持を指定するかどうかに関係なく、この動作になります。
- インターフェース B のインプリメンテーション・クラスを再生成します。このインプリメンテーション・クラスに対して行われた編集内容は、すべて失われます。どちらの場合でも、インターフェース Y および Z のインプリメンテーション・クラスをワークベンチで生成するには、以下のいずれかのステップを実行する必要があります。
- 「プロジェクト」を選択し、オプションの「自動的にビルド」が選択されていることを確認します。インターフェースを編集し、保存します。編集内容は、空白文字 1 つの追加などのわずかな変更で構いません。
- 「プロジェクト」 > 「クリーン」を選択し、プロジェクトをビルドします。
- シナリオ 5: アノテーション付きメソッドを宣言している複数のインターフェースを拡張している 1 つのインターフェース (それ自体ではアノテーション付きメソッドを宣言していない) を削除する。
- ユーザーが実行すること
- インターフェース A を削除します。このインターフェースはアノテーション付きメソッドを宣言しておらず、インターフェース Y および Z を拡張しています。
- インプリメンテーション・クラスの保持を指定した場合のワークベンチの動作
- インターフェース A のインプリメンテーション・クラスを保持します。ただし、プロジェクトにはコンパイル・エラーが含まれるようになります。
- インプリメンテーション・クラスの保持を指定しなかった場合のワークベンチの動作
- インターフェース A のインプリメンテーション・クラスを削除します。
どちらの場合でも、インターフェース Y および Z のインプリメンテーション・クラスをワークベンチで生成するには、以下のいずれかのステップを実行する必要があります。
- 「プロジェクト」を選択し、オプションの「自動的にビルド」が選択されていることを確認します。インターフェースを編集し、保存します。編集内容は、空白文字 1 つの追加などのわずかな変更で構いません。
- 「プロジェクト」 > 「クリーン」を選択し、プロジェクトをビルドします。
- シナリオ 6: アノテーション付きメソッドを宣言している複数のインターフェースを拡張している 1 つのインプリメンテーション・クラス (それ自体でもアノテーション付きメソッドが宣言している) を削除する。
- ユーザーが実行すること
- インターフェース B を削除します。このインターフェースはアノテーション付きメソッドを宣言しており、インターフェース Y および Z を拡張しています。
- インプリメンテーション・クラスの保持を指定した場合のワークベンチの動作
- インターフェース B のインプリメンテーション・クラスを保持します。ただし、プロジェクトにはコンパイル・エラーが含まれるようになります。
- インプリメンテーション・クラスの保持を指定しなかった場合のワークベンチの動作
- インターフェース B のインプリメンテーション・クラスを削除します。
どちらの場合でも、インターフェース Y および Z のインプリメンテーション・クラスをワークベンチで生成するには、以下のいずれかのステップを実行する必要があります。
- 「プロジェクト」を選択し、オプションの「自動的にビルド」が選択されていることを確認します。インターフェースを編集し、保存します。編集内容は、空白文字 1 つの追加などのわずかな変更で構いません。
- 「プロジェクト」 > 「クリーン」を選択し、プロジェクトをビルドします。