@jws:sql 文におけるパラメータの置換
このトピックでは、データベース コントロールのメソッドに関連付けられる @jws:sql タグのパラメータの置換について説明します。
データベース コントロールの詳細については、データベース コントロール : Web サービスからデータベースを使用するを参照してください。
データベース コントロールの作成方法については、新しいデータベース コントロールを作成するを参照してください。
置換は、次の条件に従って行われます。
置換のマッチングでは大文字と小文字は区別される。メソッド パラメータ CustCity は、置換パターン {custCity} と一致しません。
メソッド パラメータの型は、文で関連付けられるデータベース フィールドの型と互換性を持たなければならない。データベースが NUMBER を想定しているフィールドで Java String を置換しようとすると、文は失敗します。データベースと Java 間の各型のマッピングについては、データベース コントロールでデータベース フィールドの型を Java の型にマップするを参照してください。
{custCity } や { custCity} のように置換パターンにスペースが入っていると、置換は実行されない。Java Database Connectivity(JDBC)API では、{fn user()} という形式のエスケープ句を使用してデータベースの組み込み関数にアクセスできます。スペースが項目 {} に含まれていた場合、データベース コントロールはこの項目を JDBC エスケープ句として扱い、置換しないで渡します。JDBC のエスケープ句の詳細については、JDBC ドライバのドキュメントを参照してください。
日付または時間値を置換する場合、java.sql パッケージのクラスを使用する。たとえば、java.util.Date を SQL の Date フィールドに置換しようとしても失敗します。代わりに、java.sql.Date を使用します。
データベース コントロール メソッドのパラメータがプリミティブまたは単純な型の場合、パラメータを @jws:sql タグの statement パラメータの文字列値として {} 置換で直接参照することができます。
単純なパラメータ置換を次の例で示します。
/** * @jws:sql statement="SELECT name FROM customer WHERE city={custCity} AND state={custState}" */ public String [] getCustomersInCity( String custCity, String custState );
クエリでは、custCity メソッド パラメータの値は {custCity} 項目と置換され、custState メソッド パラメータの値は {custState} 項目と置換されます。
置換は、置換の条件で説明した条件に従って実行されます。
リテラル内の中括弧({})は無視されます。つまり、次のような文は意図したとおりに機能しません。
/** * @jws:sql statement:: * SELECT name * FROM employees * WHERE name LIKE '%{partialName}%' * :: */ public String[] partialNameSearch(String partialName);
リテラル文字列内の中括弧は無視されるので、partialName Java 文字列は SELECT 文に置換されません。この問題を回避するには、次に示すとおり、JWS ファイル内の一致文字列をあらかじめフォーマットしてからデータベース コントロールを起動します。
String partialNameToMatch = "'%" + matchString + "%'" String [] names = myDBControl.partialNameSeach(partialNameToMatch);
次のクラスが宣言され、データベース コントロールにアクセスできるものとします。
public static class Customer { public String firstName; public String lastName; public String streetAddress; public String city; private String state; public String zipCode;
public String getState() {return state}; }
次の例に示すように、Customer パラメータのメンバーを {} 置換で参照することができます。
/** * @jws:sql statement="SELECT name FROM customer WHERE city={cust.city} AND state={cust.state}" */ public String [] getCustomersInCity( Customer cust );
注意 : クラス メンバー変数とアクセサ メソッド(getXxx)は、データベース コントロールが置換できるようにパブリックでなければなりません。
パラメータ オブジェクトのメンバーにアクセスするには、ドット表記を使用します。
置換パターンが {myClass.myMember} とすると、置換する際にドット表記を解決する優先順位は次のとおりです。
myClass クラスが getMyMember() および setMyMember() パブリック メソッドを公開している場合、getMyMember() が呼び出され、戻り値は置換される。ブール変数の場合、isMyMember() を getMyMemnber() と置き換えます。
myClass クラスが myMember というパブリック フィールドを公開している場合、myClass.myMember が置換される。
myClass クラスが java.util.Map を実装している場合、myClass.get("myMember") が呼び出され、戻り値が置換される。
B が A のパブリック メンバーで、B が getC() パブリック メソッドを持つ {A.B.C} などの場合、上記のいずれの組み合わせも該当する。
上記のいずれの条件も該当しない場合、データベース コントロール メソッドは weblogic.jws.control.ControlException を送出します。
置換は、置換の条件で説明した条件に従って実行されます。
.