@Call アノテーションに指定した sql String は、Data インターフェースの call() メソッドへの最初のパラメーターとして渡された sql String で使用されているものと同じ形式を持ち、同じようにパラメーター・マーカーを参照できます。
アノテーション付きメソッドは、Data インターフェースでの call() メソッドによるストアード・プロシージャーの対応する呼び出しで渡されたものと同じパラメーターを取ります。
SQL CALL ステートメントのバッチを実行する場合には、ストアード・プロシージャーに OUT または INOUT パラメーターがなく、照会結果を戻さない場合にのみ実行することができます。
@Call アノテーション付きメソッドは、CallHandler の使用をサポートしません。
@Call アノテーション付きメソッドは、SQL CALL ステートメントのバッチをサポートしません。 ただし、SQL CALL ステートメントでバッチ操作を実行する必要がある場合、インライン・メソッドが Data.updateMany() メソッドの使用を必要とするのと似た仕方で、アノテーション付きメソッドのサポートは @Update アノテーションに依存し、汎用オブジェクトのコレクションの受け入れと同じ規則を使用し、int の配列を戻します。
アノテーション付きメソッドと、シグニチャー public StoredProcedureResult call (String sql, Object... parameters); が指定された Data.call() メソッドとの間には、もう 1 つの重要な相違点があります。 @Call アノテーション付きメソッドは、StoredProcedureResult オブジェクトを戻すように定義する必要はありません。 さらにそれらは、void を戻すか、または以下のいずれかのタイプを戻すものとしても定義できます。
void のサポートは、インターフェース設計者が、呼び出されたストアード・プロシージャーが ResultSet オブジェクトを戻さないか、または戻される ResultSet オブジェクトには関心がないかのいずれかが分かっているというケースのために提供されています。 以下に例を示します。
@Call(sql=
"CALL updateEmployee(:empno, :name, :sal, :bonus)")
public void updateMyEmployee(EmployeeBean empObject);
このストアード・プロシージャー updateEmployee は ResultSet を戻さない場合がありますが、updateEmployee の戻りの型が void であるため問題ありません。 ストアード・プロシージャーが OUT または INOUT パラメーターを戻す場合、それらは (Data.call() メソッドについて説明されているのと同じ規則を使用して) パラメーター empObject87 に置かれます。
他のすべての戻りの型 (List<Map<String,Object>> など) のサポートは、インターフェース設計者が、呼び出されたストアード・プロシージャーが単一の ResultSet オブジェクトを戻すか、または最初の ResultSet の後に戻される ResultSet オブジェクトには関心がないかのいずれかが分かっているというケースのために提供されています。 以下に例を示します。
@Call(sql="CALL GetEmployeesInDept(:deptno)")
public List<EmployeeBean> queryDeptEmployee(
DepartmentBean deptBean);
ストアード・プロシージャー GetEmployeesInDept は、deptno IN パラメーターによって deptBean から呼び出されます。 GetEmployeesInDept が IN の代わりに INOUT パラメーターを持つように定義されている場合、再び (Data.call() メソッドについて説明されているのと同じ規則を使用して) そのパラメーターの OUT 値が、deptBean の deptno プロパティーを更新するために使用されます。
ストアード・プロシージャー GetEmployeesInDept のパラメーターに関係なく、最初に戻される ResultSet を処理して 1 つ以上の EmployeeBean オブジェクトにするコードが生成され、これらのオブジェクトは List として戻されます。 さらに ResultSet オブジェクトがあるとしても、それらは無視されます。 ResultSet がまったくないか、または最初の ResultSet が EmployeeBean にマップされない場合、Exception がスローされます。