ストアドファンクション

ストアドファンクションを呼び出すには、 @Function をDaoのメソッドに注釈します。

@Config(config = AppConfig.class)
public interface EmployeeDao {
    @Function
    Integer execute(@In Integer id, @InOut Reference<BigDecimal> salary);
    ...
}

パラメータには、パラメータの種別を示す @In@InOut@Out@ResultSet のいずれかのアノテーションが必須です。 パラメータは複数指定できます。

戻り値

戻り値は次のいずれかでなければいけません。

1件を返す場合

複数件を返す場合

次のいずれかを要素とする java.util.List

ただし、複数件を返せるのはファンクションがカーソルを実行結果として返す場合のみです。

ファンクション名

デフォルトではメソッド名がファンクション名になります。 @Functionname 要素に値を指定した場合は、その値がファンクション名になります。

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

@Functioncatalog 要素や schema 要素にカタログ名やスキーマ名を指定できます。 このときファンクションの名前は catalog 要素、 schema 要素、 name 要素 (指定されていなければメソッド名)をピリオドで連結したものになります。

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

戻り値の型が エンティティクラスエンティティクラス を要素とする java.util.List の場合において、 エンティティのプロパティすべてに対して漏れなく結果セットのカラムをマッピングすることを保証したい場合は、 @FunctionensureResultMapping 要素に true を指定します。

@Function(ensureResultMapping = true)
List<Employee> execute();

結果セットのカラムにマッピングされないプロパティが存在する場合 ResultMappingException がスローされます。

パラメータ

ストアドファンクションのパラメータとDaoメソッドのパラメータの並び順は合わせなければいけません。

INパラメータ

INパラメータは、 @In をメソッドのパラメータに注釈して示します。 指定可能なパラメータの型は以下の通りです。

パラメータの型が基本型もしくはドメインクラスの場合、引数を null にできます。 それ以外の型の場合、引数は null であってはいけません。

@Function
void execute(@In Integer id);

次のように使用します。

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

INOUTパラメータ

INOUTパラメータは、 @InOut をメソッドのパラメータに注釈して示します。 注釈されるパラメータの型は org.seasar.doma.jdbc.Reference でなければいけません。 Reference の型パラメータに指定できる型は以下の通りです。

引数は null であってはいけません。

@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パラメータは、 @Out をメソッドのパラメータに注釈して示します。 注釈されるパラメータの型は org.seasar.doma.jdbc.Reference でなければいけません。 Reference の型パラメータに指定できる型は以下の通りです。

引数は null であってはいけません。

メソッドの戻り値の型が void 以外の場合、戻り値はOUTパラメータとなります。

@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パラメータもしくは結果セット

カーソルのOUTパラメータ、もしくはストアドファンクションが返す結果セットは、 @ResultSet をメソッドのパラメータに注釈して示します。 注釈されるパラメータの型は、以下の型を要素とする java.util.List でなければいけません。

引数は null であってはいけません。

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

次のように使用します。

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

@ResultSet が注釈された java.util.List の型パラメータが エンティティクラス であり、かつ、エンティティのプロパティすべてに対して 漏れなく結果セットのカラムをマッピングすることを保証したい場合は、 @ResultSetensureResultMapping 要素に true を指定します。

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

結果セットのカラムにマッピングされないプロパティが存在する場合 ResultMappingException がスローされます。

マップのキーのネーミング規約

結果セットを java.util.Map<String, Object> にマッピングする場合、 @FunctionmapKeyNaming 要素にマップのキーのネーミング規約を指定できます。

@Function(mapKeyNaming = MapKeyNamingType.CAMEL_CASE)
List<Map<String, Object>> execute(@In Integer id);

MapKeyNamingType.CAMEL_CASE は、カラム名をキャメルケースに変換することを示します。 そのほかに、カラム名をを大文字や小文字に変換する規約があります。

最終的な変換結果は、ここに指定した値と 設定 に指定された MapKeyNaming の実装により決まります。

SQL のログ出力形式

@FunctionsqlLog 要素に SQL のログ出力形式を指定できます。

@Function(sqlLog = SqlLogType.RAW)
void execute(@In Integer id);

SqlLogType.RAW はバインドパラメータ(?)付きの SQL をログ出力することを表します。