概要
ストアドファンクションを呼び出すには、@FunctionをDaoのメソッドに注釈します。
@Config(config = AppConfig.class)
public interface EmployeeDao {
@Function
Integer execute(@In Integer id, @InOut Reference<BigDecimal> salary);
...
}
パラメータには、パラメータの種別を示す@In、
@InOut、
@Out、
@ResultSetのいずれかのアノテーションが必須です。
パラメータは複数指定できます。
戻り値は次のいずれかでなければいけません。
ファンクション名
デフォルトではメソッド名がファンクション名になります。
@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);
戻り値の型がエンティティクラスやエンティティクラスを要素とするjava.util.Listの場合において、エンティティのプロパティすべてに対して漏れなく結果セットのカラムをマッピングすることを保証したい場合は、@FunctionのensureResultMapping要素にtrueを指定します。
@Function(ensureResultMapping = true) List<Employee> execute();
結果セットのカラムにマッピングされないプロパティが存在する場合org.seasar.doma.jdbc.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.Map<String, Object>のいずれかを要素とする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) {
...
}
検索結果を受ける型がエンティティクラスやエンティティクラスを要素とするjava.util.Listの場合において、エンティティのプロパティすべてに対して漏れなく結果セットのカラムをマッピングすることを保証したい場合は、@ResultSetのensureResultMapping要素にtrueを指定します。
@Function void execute(@ResultSet(ensureResultMapping = true) List<Employee> employee);
結果セットのカラムにマッピングされないプロパティが存在する場合org.seasar.doma.jdbc.ResultMappingExceptionがスローされます。
マップのキーのネーミング規約
結果セットをjava.util.Map<String, Object>にマッピングする場合、
@FunctionのmapKeyNaming要素にマップのキーのネーミング規約を指定できます。
@Function(mapKeyNaming = MapKeyNamingType.CAMEL_CASE) List<Map<String, Object>> execute(@In Integer id);
MapKeyNamingType.CAMEL_CASEは、カラム名をキャメルケースに変換することを示します。
そのほかに、カラム名をを大文字や小文字に変換する規約があります。
指定しない場合、変換は行われません。
