ビュー・オブジェクトは、通常は1つ以上の基礎となるエンティティ・オブジェクトに基づいています。ただし、他のデータソースに基づくビュー・オブジェクトも作成できます。これは、このリリースの新機能です。この場合、ビュー・オブジェクト問合せはSQL文ではないため、ビュー・オブジェクトの実装クラスのコードをオーバーライドし、データを収集および処理する必要があります。このタイプのビュー・オブジェクトは、次のような任意のデータソースから作成できます。
このトピックでは、静的な値セットに基づくビュー・オブジェクトの作成方法を説明します。HRスキーマに基づくビジネス・コンポーネント・プロジェクトを使用します。
ビジネス・コンポーネント・プロジェクトを作成するには、次のようにします。
HR
を入力します)。「次へ」をクリックします。これで、Locations表のデフォルト・ビューが作成されました。このビューは、LocationId属性に基づいてスクロールできます。ここで、レコードを国名ごとに参照する必要があるとします。次の2つの問題があります。
ここで、CountryNameおよびAbbreviationという2つの属性を含む新規ビュー・オブジェクトを作成します。これらの属性は一時属性であり、データベース表にマップされません。したがって、ビュー・オブジェクトの基礎としてエンティティ・オブジェクトを使用しないか、ウィザードで問合せ文を作成します。
2つの一時属性を含むビュー・オブジェクトを作成するには、次のようにします。
CountryCodesView
を入力し、「次へ」をクリックします。CountryName
と入力します。「OK」をクリックします。Abbreviation
という属性を作成します。2つの一時(マップされない)属性を含むビュー・オブジェクトを作成しました。ビュー・オブジェクトの問合せに国および略称のリストを移入するには、ビュー・オブジェクトの実装クラスのコードを編集して次のいずれかを行う必要があります。
実装クラスを編集するには、次のようにします。
CountryCodesViewImpl.java
」をダブルクリックし、ソース・エディタで開きます。ビュー・オブジェクトには、2つの一時属性が含まれています。最初に、コンストラクタ・メソッドにコードを追加し、国の名前および略称を含むベクターを宣言および初期化します。完成したコードは次のようになります。
public class CountryCodesViewImpl extends oracle.jbo.server.ViewObjectImpl { static final String [] countryStr = { "AR,Argentina", "AU,Australia", "BE,Belgium", "BR,Brazil", "CA,Canada", "CH,Switzerland", "CN,China", "DE,Germany", "DK,Denmark", "EG,Egypt", "FR,France", "HK,HongKong", "IL,Israel", "IN,India", "IT,Italy", "JP,Japan", "KW,Kuwait", "MX,Mexico", "NG,Nigeria", "NL,Netherlands", "SG,Singapore", "UK,United Kingdom", "US,United States of America", "ZM,Zambia", "ZW,Zimbabwe" }; static Vector countries = new Vector(countryStr.length); /** * This is the default constructor (do not remove) */ public CountryCodesViewImpl() { if (countries.isEmpty()) { for (int i=0; i<countryStr.length; i++) { countries.add(i, countryStr[i]); } } }
次に、executeQueryForCollection()
をオーバーライドすることにより、ビュー・オブジェクトの問合せの結果を問合せコレクションに移入します。この場合、問合せ結果は静的ベクターの内容です。完成したコードは次のようになります。
protected void executeQueryForCollection( Object qc, Object[] params, int noUserParams) { super.executeQueryForCollection(qc, params, noUserParams); // associate relevant data with this query collection: our // countries Vector, its size, and an index we'll use when // populating the rowset setUserDataForCollection(qc, new Object[] {countries, new Integer(countries.size()), new Integer(0)}); }
次に、結果セットに行が残っているかどうかを判断します。これを行うには、hasNextForCollection()
をオーバーライドします。このメソッドは、結果セットのサイズを次の行の索引と比較し、結果セットに他にも行があるかどうかを判断します。完成したコードは次のようになります。
protected boolean hasNextForCollection(Object qc) { Object[] userData = (Object[])getUserDataForCollection(qc); // userData[0] is the result set // userData[1] is the number of rows in the result set // userData[2] is the index of the next row if (userData == null || userData[0] == null) { return false; } // has the index moved beyond the end of the list of countries? int index = ((Integer)userData[2]).intValue(); if (index >= ((Integer)userData[1]).intValue()) { setFetchCompleteForCollection(qc, true); return false; } return true; }
最後に、結果セット内の次の行を返します。これを行うには、createRowFromResultSet()
をオーバーライドします。このメソッドは、結果セット内の次の行を返します。完成したコードは次のようになります。
protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet resultSet) { Object[] userData = (Object[])getUserDataForCollection(qc); if (userData == null || userData[0] == null) { return null; } // are there any more rows to fetch? int index = ((Integer)userData[2]).intValue(); if (index >= ((Integer)userData[1]).intValue()) { setFetchCompleteForCollection(qc, true); return null; } // Create and populate a new row ViewRowImpl vRow = createNewRowForCollection(qc); Vector data = (Vector)userData[0]; StringTokenizer st = new StringTokenizer((String)data.get(index), ","); populateAttributeForRow(vRow, 0, st.nextToken()); populateAttributeForRow(vRow, 1, st.nextToken()); userData[2] = new Integer(++index); return vRow; }
これで、実装クラスに国の名前および略称がリストされた新規ビュー・オブジェクトが完成しました。この時点で、ビュー・オブジェクトをテストし、その動作を確認できます。
ビュー・オブジェクトをテストする方法
国の名前および略称は、読取り専用モードであることに注意してください。ビュー・オブジェクトがエンティティ・オブジェクトに基づいている場合とは異なり、ここで値を変更することはできません。値は実装クラスで変更する必要があります。
これでビュー・オブジェクトが完成しました。次に、このビュー・オブジェクトに便利な機能を追加できます。たとえば、このビュー・オブジェクトをLocationsViewにリンクできます。これにより、レコードを国ごとにスクロールできるようになります。これを行うには、新規ビュー・リンクを作成し、アプリケーション・モジュールのデータ・モデルを編集する必要があります。
CountryCodesViewからLocationsViewへのビュー・リンクを作成するには、次のようにします。
CountriesToLocationsLink
を入力します。「次へ」をクリックします。アプリケーション・モジュールを編集するには、次のようにします。
アプリケーション・モジュールをテストするには、次のようにします。
ビュー・オブジェクトは、必ずしもデータベース問合せに基づく必要はありません。実装クラスのメソッドをオーバーライドすることにより、任意のデータソースを使用できます。このビュー・オブジェクトは、他のビュー・オブジェクトと同様に使用できます。レコードのスクロール、別のビュー・オブジェクトへのリンク、ユーザー・インタフェース・コンポーネントのバインドを行うことができます。