ストアドファンクション¶
目次
ストアドファンクションを呼び出すには、 @Function
をDaoのメソッドに注釈します。
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Function
Integer execute(@In Integer id, @InOut Reference<BigDecimal> salary);
...
}
パラメータには、パラメータの種別を示す @In
、 @InOut
、 @Out
、 @ResultSet
のいずれかのアノテーションが必須です。
パラメータは複数指定できます。
戻り値¶
戻り値は次のいずれかでなければいけません。
1件を返す場合¶
- Basic classes
- Domain classes
- Entity classes
- java.util.Map<String, Object>
- Basic classes 、 Domain classes 、 Entity classes 、 java.util.Map<String, Object> のいずれかを要素とするjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
複数件を返す場合¶
次のいずれかを要素とする java.util.List
- Basic classes
- Domain classes
- Entity classes
- java.util.Map<String, Object>
- Basic classes もしくは Domain classes のいずれかを要素とするjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
ただし、複数件を返せるのはファンクションがカーソルを実行結果として返す場合のみです。
ファンクション名¶
デフォルトではメソッド名がファンクション名になります。
@Function
の name
要素に値を指定した場合は、その値がファンクション名になります。
@Function(name = "calculateSalary")
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);
@Function
の catalog
要素や schema
要素にカタログ名やスキーマ名を指定できます。
このときファンクションの名前は catalog
要素、 schema
要素、 name
要素
(指定されていなければメソッド名)をピリオドで連結したものになります。
@Function(catlog = "CATALOG", schema ="SCHEMA", name = "calculateSalary")
void execute(@In Integer id, @InOut Reference<BigDecimal> salary);
戻り値の型が Entity classes や Entity classes を要素とする java.util.List
の場合において、
エンティティのプロパティすべてに対して漏れなく結果セットのカラムをマッピングすることを保証したい場合は、
@Function
の ensureResultMapping
要素に true
を指定します。
@Function(ensureResultMapping = true)
List<Employee> execute();
結果セットのカラムにマッピングされないプロパティが存在する場合
ResultMappingException
がスローされます。
パラメータ¶
ストアドファンクションのパラメータとDaoメソッドのパラメータの並び順は合わせなければいけません。
INパラメータ¶
INパラメータは、 @In
をメソッドのパラメータに注釈して示します。
指定可能なパラメータの型は以下の通りです。
- Basic classes
- Domain classes
- Basic classes または Domain classes を要素とするjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
パラメータの型が基本型もしくはドメインクラスの場合、引数を null
にできます。
それ以外の型の場合、引数は null
であってはいけません。
@Function
void execute(@In Integer id);
次のように使用します。
EmployeeDao dao = new EmployeeDaoImpl();
dao.execute(1);
INOUTパラメータ¶
INOUTパラメータは、 @InOut
をメソッドのパラメータに注釈して示します。
注釈されるパラメータの型は org.seasar.doma.jdbc.Reference
でなければいけません。
Reference
の型パラメータに指定できる型は以下の通りです。
- Basic classes
- Domain classes
- Basic classes または Domain classes を要素とするjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
引数は 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
の型パラメータに指定できる型は以下の通りです。
- Basic classes
- Domain classes
- Basic classes または Domain classes を要素とするjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
引数は 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
でなければいけません。
- Basic classes
- Domain classes
- Entity classes
- java.util.Map<String, Object>
- Basic classes または Domain classes を要素とするjava.util.Optional
- java.util.OptionalInt
- java.util.OptionalLong
- java.util.OptionalDouble
引数は 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
の型パラメータが
Entity classes であり、かつ、エンティティのプロパティすべてに対して
漏れなく結果セットのカラムをマッピングすることを保証したい場合は、
@ResultSet
の ensureResultMapping
要素に true
を指定します。
@Function
void execute(@ResultSet(ensureResultMapping = true) List<Employee> employee);
結果セットのカラムにマッピングされないプロパティが存在する場合
ResultMappingException
がスローされます。
マップのキーのネーミング規約¶
結果セットを java.util.Map<String, Object>
にマッピングする場合、
@Function
の mapKeyNaming
要素にマップのキーのネーミング規約を指定できます。
@Function(mapKeyNaming = MapKeyNamingType.CAMEL_CASE)
List<Map<String, Object>> execute(@In Integer id);
MapKeyNamingType.CAMEL_CASE
は、カラム名をキャメルケースに変換することを示します。
そのほかに、カラム名をを大文字や小文字に変換する規約があります。
最終的な変換結果は、ここに指定した値と Configuration に指定された
MapKeyNaming
の実装により決まります。
SQL のログ出力形式¶
@Function
の sqlLog
要素に SQL のログ出力形式を指定できます。
@Function(sqlLog = SqlLogType.RAW)
void execute(@In Integer id);
SqlLogType.RAW
はバインドパラメータ(?)付きの SQL をログ出力することを表します。