ストアドプロシージャ

ストアドプロシージャを呼び出すには、DAO メソッドに @Procedure アノテーションを付ける必要があります。

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

戻り値

メソッドの戻り値の型は void でなければなりません。

プロシージャ名

デフォルトでは、注釈付きのメソッド名がプロシージャ名として使用されます。別の名前を指定するには、@Procedure 注釈の name プロパティを設定してください。

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

パラメータ

ストアド プロシージャのパラメータの順序は、DAO メソッドのパラメータの順序と一致する必要があります。

すべてのパラメータには、次のいずれかのアノテーションを付ける必要があります。

  • @In

  • @InOut

  • @Out

  • @ResultSet

IN パラメータ

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

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

@Procedure
void execute(@In Integer id);

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

void doSomething() {
    EmployeeDao dao = new EmployeeDaoImpl();
    dao.execute(1);
}

INOUT パラメータ

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

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

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

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

void doSomething() {
    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 である必要があり、その型パラメータは次のいずれかである必要があります。

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

@Procedure
void execute(@Out Reference<BigDecimal> salary);

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

void doSomething() {
    EmployeeDao dao = new EmployeeDaoImpl();
    Reference<BigDecimal> ref = new Reference<BigDecimal>();
    dao.execute(ref);
    BigDecimal out = ref.get();
}

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

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

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

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

@Procedure
void execute(@ResultSet List<Employee> employees);

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

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