ストアドファンクション

ストアドファンクションを呼び出すには、DAO メソッドに @Function アノテーションを付ける必要があります。

@Dao
public interface EmployeeDao {
    @Function
    Integer execute(@In Integer id, @InOut Reference<BigDecimal> salary);
    ...
}

戻り値の型

ストアドファンクションが何も返さない場合、戻り値の型は void でなければなりません。

ストアドファンクションが単一の結果を返す場合、戻り値の型は次のいずれかである必要があります。

ストアドファンクションが結果リストを返す場合、戻り値の型は java.util.List であり、その要素の型は次のいずれかである必要があります。

ファクション名

アノテーションが付けられたメソッド名は、デフォルトで関数名として認識されます。これをオーバーライドするには、 @Functionname 要素に値を指定します。

@Function(name = "calculateSalary")
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);

パラメータ

ストアドファンクションのパラメータの順序は、DAO メソッドのパラメータの順序と一致する必要があります。

すべてのパラメータには、次のいずれかの注釈を付ける必要があります。

  • @In

  • @InOut

  • @Out

  • @ResultSet

IN パラメータ

IN パラメータを示すには、対応する DAO メソッド パラメータに @In アノテーションを付けます。 DAO メソッド パラメータのタイプは、次のいずれかである必要があります。

次の定義があるとします。

@Function
void execute(@In Integer id);

このメソッドは次のように呼び出すことができます。

EmployeeDao dao = new EmployeeDaoImpl();
dao.execute(1);

INOUT パラメータ

INOUT パラメータを示すには、対応する DAO メソッド パラメータに @InOut アノテーションを付けます。 DAO メソッド パラメータの型は org.seasar.doma.jdbc.Reference である必要があり、その type パラメータは次のいずれかである必要があります。

次の定義があるとします。

@Function
void execute(@InOut Reference<BigDecimal> salary);

このメソッドは次のように呼び出すことができます。

EmployeeDao dao = new EmployeeDaoImpl();
BigDecimal in = new BigDecimal(100);
Reference<BigDecimal> ref = new Reference<BigDecimal>(in);
dao.execute(ref);
BigDecimal out = ref.get();

OUT パラメータ

OUT パラメータを示すには、対応する DAO メソッドパラメータに @Out アノテーションを付けます。 DAO メソッド パラメータの型は org.seasar.doma.jdbc.Reference である必要があり、その type パラメータは次のいずれかである必要があります。

次の定義があるとします。

@Function
Integer execute(@Out Reference<BigDecimal> salary);

このメソッドは次のように呼び出すことができます。

EmployeeDao dao = new EmployeeDaoImpl();
Reference<BigDecimal> ref = new Reference<BigDecimal>();
Integer result = dao.execute(ref);
BigDecimal out = ref.get();

カーソルのOUTパラメータもしくは結果セット

カーソルまたは結果セットを示すには、対応する DAO メソッドのパラメータに @ResultSet アノテーションを付けます。

DAO メソッドのパラメータの型は java.util.List であり、その要素の型は次のいずれかである必要があります。

次の定義があるとします。

@Function
void execute(@ResultSet List<Employee> employee);

このメソッドは次のように呼び出すことができます。

EmployeeDao dao = new EmployeeDaoImpl();
List<Employee> employees = new ArrayList<Employee>();
dao.execute(employees);
for (Employee e : employees) {
    ...
}