About

ドキュメント

Javadoc

モジュール

プロジェクト文書

Built by Maven

検索

複数件検索

複数件を検索する場合は、gerResultList()を使います。

List<Employee> results = jdbcManager.from(Employee.class).getResultList();

検索するエンティティは、from()で指定します。

デフォルトでは、結果がなかった場合は、 空の List が返されます。 disallowNoResult() を呼び出すと、 結果がなかった場合は javax.persistence.NoResultException が発生します。

List<Employee> results = jdbcManager.from(Employee.class)
                                    .disallowNoResult()
                                    .getResultList();

1件検索

1件検索する場合は、getSingleResult()を使います。

Employee result = jdbcManager.from(Employee.class).getSingleResult();

結果が複数件になる場合は、 javax.persistence.NonUniqueResultException が発生します。

Employee result = jdbcManager.from(Employee.class)
                             .where("id = ?", id)
                             .getSingleResult();

デフォルトでは、結果がなかった場合は、 null が返されます。 disallowNoResult() を呼び出すと、 結果がなかった場合は javax.persistence.NoResultException が発生します。

Employee result = jdbcManager.from(Employee.class)
                             .where("id = ?", id)
                             .disallowNoResult()
                             .getSingleResult();

結合

他のエンティティを結合する場合は、次のメソッドを使用します。

  • innerJoin(String)
  • innerJoin(String, boolean)
  • leftOuterJoin(String)
  • leftOuterJoin(String, boolean)

第1引数は、結合したいエンティティのプロパティ名です。

List<Employee> results = jdbcManager.from(Employee.class)
                                    .innerJoin("department").getResultList();

次のように外部結合にすることもできます。

List<Employee> results = jdbcManager.from(Employee.class)
                                    .leftOuterJoin("department").getResultList();

検索条件には含めたいけど、検索結果には含めたくない場合、 2番名の引数をfalseにします。

List<Employee> results = jdbcManager.from(Employee.class)
                                    .innerJoin("department", false)
                                    .where("department.name = 'RESEARCH'")
                                    .getResultList();

結合は、employee.addressのようにネストすることもできます。 ネストする場合は、必ずベースとなる結合を先に指定します。 employee.addressの場合、employeeがベースとなる結合です。

List<Department> results = jdbcManager.from(Department.class)
                                    .leftOuterJoin("employee")
                                    .leftOuterJoin("employee.address")
                                    .getResultList();

結合は、多対一関連、一対多関連、一対一関連のどれでも可能で、 いくつでもネストすることが可能です。

検索条件

IDとバージョンによる指定

IDプロパティ (主キー) を指定して検索対象を指定する場合は、 id(Object...) を使います。 引数はエンティティに定義されたIDプロパティと同じ数・同じ並びで指定します。

jdbcManager.from(Department.class)
    .id(100)
    .getSingleResult();

IDと同時にバージョンを指定することもできます。 バージョンプロパティを指定する場合は、 version(Object) を使います。

jdbcManager.from(Department.class)
    .id(100).version(10)
    .getSingleResult();

IDを指定しないでバージョンだけを指定することはできません。

SQL文字列による指定

より複雑な検索条件を指定する場合は、where()を使います。 where()に書くことのできる条件は、SQLと同じです。 SQLとの違いは、カラム名の代わりにプロパティ名を書くことです。 関連先のプロパティを指定する場合は、innerJoin()/leftOuterJoin()で指定した名前. プロパティ名になります。

jdbcManager.from(Department.class)
    .leftOuterJoin("employeeList")
    .leftOuterJoin("employeeList.address")
    .where("employeeList.salary between ? and ? and employeeList.address.street like ?", ...)
    .getResultList();

java.util.Datejava.util.Calendar 型のパラメータを指定する場合は、時制を指定することができます。 時制の指定は org.seasar.extension.jdbc.parameter.Parameter のstaticメソッドを使います。

date(Date) または date(Calendar)
パラメータをSQL標準のDATE型 (日付のみ) として扱います。
date(Date) または date(Calendar)
パラメータをSQL標準のTIME型 (時刻のみ) として扱います。
date(Date) または date(Calendar)
パラメータをSQL標準のTIMESTAMP型 (日付と時刻) として扱います。
import static org.seasar.extension.jdbc.parameter.Parameter.*;

jdbcManager.from(Employee.class)
    .where("heredate = ?", date(heredate))
    .getResultList();

byte[]String 型のパラメータを指定する場合は、ラージオブジェクトであることを指定することができます。 ラージオブジェクトの指定は org.seasar.extension.jdbc.parameter.Parameter のstaticメソッドを使います。

lob(String)
パラメータをCLOBとして扱います。
lob(byte[]) または lob(Serializable)
パラメータをBLOBとして扱います。
import static org.seasar.extension.jdbc.parameter.Parameter.*;

jdbcManager.from(Employee.class)
    .where("largeName = ?", lob(largeName))
    .getResultList();

SimpleWhere による指定

検索条件の入力画面などでは、ユーザの入力があった部分をandでつないで、 条件を組み立てるということが良く行われます。 このようなケースを簡単に処理するために、 SimpleWhereとMapでも、検索条件を指定できるようにしています。

名前、仕事タイプ、給与の上限下限を条件に検索する画面を考えてみましょう。 べたに検索条件を組み立てるとはこんな感じになるはずです。

public String departmentName;
public String[] jobTypes = new String[0];
public BigDecimal salaryMax;
public BigDecimal salaryMin;
...
StringBuilder sb = new StringBuilder(100);
boolean found = false;
List<Object> values = new ArrayList<Object>();
if (departmentName != null) {
    sb.append("department.name = ?");
    values.add(departmentName);
    found = true;
}
if (jobTypes.length > 0) {
    if (found) {
        sb.append(" and ");
    }
    sb.append("jobType in (");
    for (JobType jt : jobTypes) {
        sb.append("?, ");
        values.add(jt);
    }
    sb.setLength(sb.length() - 2);
    sb.append(")");
    found = true;
}
if (salaryMin != null) {
    if (found) {
        sb.append(" and ");
    }
    sb.append("salary >= ?");
    values.add(salaryMin);
    found = true;
}
if (salaryMax != null) {
    if (found) {
        sb.append(" and ");
    }
    sb.append("salary <= ?");
    values.add(salaryMax);
    found = true;
}
jdbcManager.from(Employee.class).where(sb.toString(), values.toArray()).getResultList();

SimpleWhereを使って組み立てれば、こんなに簡単になります。

public String departmentName;
public String[] jobTypes = new String[0];
public BigDecimal salaryMax;
public BigDecimal salaryMin;
...
jdbcManager.from(Employee.class)
    .where(new SimpleWhere()
        .eq("department.name", departmentName)
        .in("jobType", jobTypes)
        .ge("salary", salaryMin)
        .le("salary", salaryMax))
    .getResultList();

SimpleWhereには次のメソッドがあります。

メソッド 説明
eq(String propertyName, Object value) propertyName = ? の条件を追加します。valueがnullの時は追加されません。
ne(String propertyName, Object value) propertyName <> ? の条件を追加します。valueがnullの時は追加されません。
lt(String propertyName, Object value) propertyName < ? の条件を追加します。valueがnullの時は追加されません。
le(String propertyName, Object value) propertyName <= ? の条件を追加します。valueがnullの時は追加されません。
gt(String propertyName, Object value) propertyName > ? の条件を追加します。valueがnullの時は追加されません。
ge(String propertyName, Object value) propertyName >= ? の条件を追加します。valueがnullの時は追加されません。
in(String propertyName, Object... values) propertyName in (?, ...) の条件を追加します。 valuesの配列の長さが0の時は追加されません。
not in(String propertyName, Object... values) propertyName not in (?, ...) の条件を追加します。 valuesの配列の長さが0の時は追加されません。
like(String propertyName, String value) propertyName like ? の条件を追加します。 valueがnullの時は追加されません。
starts(String propertyName, String value) propertyName like ? の条件を追加します。 valueがnullの時は追加されません。 valueの最後に自動的に % が追加されます。
ends(String propertyName, String value) propertyName like ? の条件を追加します。 valueがnullの時は追加されません。 valueの最初に自動的に % が追加されます。
contains(String propertyName, String value) propertyName like ? の条件を追加します。 valueがnullの時は追加されません。 valueの最初と最後に自動的に % が追加されます。
isNull(String propertyName, Boolean value) propertyName is null の条件を追加します。 valueがnullあるいはBoolean.FALSEの時は追加されません。
isNotNull(String propertyName, Boolean value) propertyName is not null の条件を追加します。 valueがnullあるいはBoolean.FALSEの時は追加されません。

SimpleWhere による指定

Mapを使うと次のようになります。

public String departmentName;
public String[] jobTypes = new String[0];
public BigDecimal salaryMax;
public BigDecimal salaryMin;
...
Map<String, Object> w = new HashMap<String, Object>();
w.put("department.name", departmentName);
w.put("jobType_IN", jobTypes);
w.put("salary_LE", salaryMax);
w.put("salary_GE", salaryMin);
jdbcManager.from(Employee.class).where(w).getResultList();

マップのキーにプロパティ名_サフィックスを指定します。 サフィックスがない場合は、 _EQ が指定されたとみなされます。

次のサフィックスを使うことができます。

サフィックス 説明
_EQ propertyName = ? の条件を追加します。valueがnullの時は追加されません。
_NE propertyName <> ? の条件を追加します。valueがnullの時は追加されません。
_LT propertyName < ? の条件を追加します。valueがnullの時は追加されません。
_LE propertyName <= ? の条件を追加します。valueがnullの時は追加されません。
_GT propertyName > ? の条件を追加します。valueがnullの時は追加されません。
_GE propertyName >= ? の条件を追加します。valueがnullの時は追加されません。
_IN propertyName in (?, ...) の条件を追加します。 valuesの配列の長さが0の時は追加されません。 値は配列のみをサポートしています。
_NOT_IN propertyName not in (?, ...) の条件を追加します。 valuesの配列の長さが0の時は追加されません。 値は配列のみをサポートしています。
_LIKE propertyName like ? の条件を追加します。 valueがnullの時は追加されません。
_STARTS propertyName like ? の条件を追加します。 valueがnullの時は追加されません。 valueの最後に自動的に % が追加されます。
_ENDS propertyName like ? の条件を追加します。 valueがnullの時は追加されません。 valueの最初に自動的に % が追加されます。
_CONTAINS propertyName like ? の条件を追加します。 valueがnullの時は追加されません。 valueの最初と最後に自動的に % が追加されます。
_IS_NULL propertyName is null の条件を追加します。 valueがnullあるいはBoolean.FALSEの時は追加されません。 値はBooleanのみをサポートしています。
_IS_NOT_NULL propertyName is not null の条件を追加します。 valueがnullあるいはBoolean.FALSEの時は追加されません。 値はBooleanのみをサポートしています。

マップの組み立てを手動でやる必要は、基本的にありません。 なぜなら、SimpleWhereのほうが便利だからです。 マップを使う場合は、次のように org.seasar.framework.beans.util.Beans を使います。

createAndCopy(Class<T> destClass, Object src) の第一引数には、BeanMap.classを指定します。 BeanMapはMap<String, Object>なクラスで、 存在しないキーにアクセスすると 例外が発生します。 キーの値は、AAA_BBBのような'_'記法の値ををaaaBbbのようなキャメル記法に 変換したものです。 第二引数にはコピー元になるオブジェクトを指定します。

prefix(String prefix) の引数には、プロパティ名のプレフィックスを指定します。 プレフィックスを指定した場合、プレフィックスを持つプロパティだけが対象になります。 プロパティ名がマップのキーに変換されるときに、 プレフィックスは削除され、'$'は'.'に変換されます。

public String where_department$name;
public String[] where_jobType_IN = new String[0];
public BigDecimal where_salary_LE;
public BigDecimal where_salary_GE;
...
jdbcManager.from(Employee.class)
    .where(Beans.createAndCopy(BeanMap.class, this).prefix("where_").execute())
    .getResultList();

ソート順

ソート順を指定する場合は、 orderBy() を使います。 orderBy() に書くことのできる条件は、SQLと同じです。 SQLとの違いは、カラム名の代わりにプロパティ名を書くことです。 関連先のプロパティを指定する場合は、innerJoin()/leftOuterJoin()で指定した名前. プロパティ名になります。

jdbcManager.from(Employee.class)
    .leftOuterJoin("department")
    .orderBy("name, department.name")
    .getResultList();

排他制御

SELECT時にロックを取得する場合は、

  • forUpdate()
  • forUpdate(String... propertyNames)
  • forUpdateNowait()
  • forUpdateNowait(String... propertyNames)
  • forUpdateWait(int seconds)
  • forUpdateWait(int seconds, String... propertyNames)

を使います。 全てのRDBMSでこれらの操作が利用できるわけではありません。 サポートされていないメソッドを呼び出すと UnsupportedOperationException がスローされます。

forUpdate(String...)forUpdateNowait(String...) の第1引数および forUpdateWait(int, String...) の第2引数には、ロック対象となるプロパティ名を指定します。

forUpdateWait(int)forUpdateWait(int, String...) の第1引数では、ロックを獲得できるまでの最大待機時間を秒単位で指定します。

以下の例では、EmployeeとDepartmentを結合していて、 ロック対象のプロパティが明示されていないので、両テーブルのロックが取得されます。

jdbcManager.from(Employee.class)
    .leftOuterJoin("department")
    .where("department.name = ?", deptName)
    .forUpdate()
    .getResultList();

以下の例でもEmployeeとDepartmentを結合していますが、 指定されたプロパティを持つEmployeeのロックのみが取得されます。

jdbcManager.from(Employee.class)
    .leftOuterJoin("department")
    .where("department.name = ?", deptName)
    .forUpdate("id")
    .getResultList();

排他制御とページングを組み合わせることはできません。

ページング

ページングを指定する場合は、 limit(), offset() を使います。 limit() には、取得する行数を指定します。 offset() には、最初に取得する行の位置を指定します。 最初の行の位置は0になります。 ページングを指定するには、必ず ソート順 の指定も必要です。

jdbcManager.from(Employee.class)
    .orderBy("name")
    .limit(100)
    .offset(10)
    .getResultList();

排他制御とページングを組み合わせることはできません。

最大行数

最大行数を指定する場合は、 maxRows() を使います。 最大行数を超える行は、通知なしに除外されます。

jdbcManager.from(Employee.class)
    .maxRows(1000)
    .getResultList();

フェッチサイズ

フェッチサイズを指定する場合は、 fetchSize() を使います。

jdbcManager.from(Employee.class)
    .fetchSize(100)
    .getResultList();

クエリタイムアウト

クエリタイムアウト(秒)を指定する場合は、 queryTimeout() を使います。

jdbcManager.from(Employee.class)
    .queryTimeout(10)
    .getResultList();

挿入

1件挿入

エンティティを挿入する場合は、 insert()execute() を組み合わせます。

int count = jdbcManager.insert(employee).execute();

引数はエンティティで、戻り値は、更新した行数です。 挿入するときに、識別子を自動設定することができます。 詳しくは、 識別子定義 を参照してください。

一意制約違反によりエンティティ挿入ができなかった場合は、 javax.persistence.EntityExistsException が発生します。

バッチ挿入

複数のエンティティをバッチ挿入する場合は、 insertBatch()execute() を組み合わせます。

int[] countArray = jdbcManager.insertBatch(employees).execute();

引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 挿入するときに、識別子を自動設定することができます。 詳しくは、 識別子定義 を参照してください。

一意制約違反によりエンティティを挿入ができなかった場合は、 javax.persistence.EntityExistsException が発生します。

nullの項目を挿入しない

挿入の対象からnullの項目を除外する場合は、 excludesNull() を使います。 バッチ系の挿入は、すべてのエンティティに同じSQLを適用しなければならないので、 nullを除外してバッチ挿入することはできません。 なぜなら、すべてのエンティティのnullの項目が同じだとは限らないからです。

int count = jdbcManager.insert(employee).excludesNull().execute();

指定したプロパティのみを挿入対象にする

指定したプロパティのみを挿入対象にする場合は、 includes() を使います。

int count = jdbcManager.insert(employee).includes("id", "name").execute();

指定したプロパティを挿入対象から除外する

指定したプロパティを挿入対象から除外する場合は、 excludes() を使います。

int count = jdbcManager.insert(employee).excludes("version").execute();

バッチ挿入のサイズを指定する

バッチ挿入のサイズを設定するには batchSize() を使います。

int[] countArray = jdbcManager.insertBatch(employees).batchSize(50).execute();

更新

1件更新

エンティティを更新する場合は、 update()execute() を組み合わせます。

int count = jdbcManager.update(employee).execute();

引数はエンティティで、戻り値は、更新した行数です。 更新するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。

バッチ更新

複数のエンティティをバッチ更新する場合は、 updateBatch()execute() を組み合わせます。

int[] countArray = jdbcManager.updateBatch(employees).execute();

引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 更新するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。

バージョンプロパティを通常の更新対象にする

バージョンプロパティを通常の更新対象に含め、バージョンチェックの対象外にする場合は、 includesVersion() を使います。

int count = jdbcManager.update(employee).includesVersion().execute();

nullの項目を更新しない

更新の対象からnullの項目を除外する場合は、 excludesNull() を使います。 バッチ系の更新は、すべてのエンティティに同じSQLを適用しなければならないので、 nullを除外してバッチ更新することはできません。 なぜなら、すべてのエンティティのnullの項目が同じだとは限らないからです。

int count = jdbcManager.update(employee).excludesNull().execute();

指定したプロパティのみを更新対象にする

指定したプロパティのみを更新対象にする場合は、 includes() を使います。

int count = jdbcManager.update(employee).includes("id", "name").execute();

指定したプロパティを更新対象から除外する

指定したプロパティを更新対象から除外する場合は、 excludes() を使います。

int count = jdbcManager.updateBatch(employees).excludes("version").execute();

変更のあったプロパティのみを更新対象にする

変更のあったプロパティのみを更新対象にする場合は、 changedFrom() を使います。バッチ系の更新は、すべてのエンティティに同じSQLを適用しなければならないので、 変更のあったプロパティのみをバッチ更新することはできません。 なぜなら、変更のあったプロパティがすべてのエンティティで同じだとは限らないからです。 最初の引数は、比較の対象にする以前のエンティティもしくはマップです。

Employee before = ...;
int count = jdbcManager.updateBatch(employees).changedFrom(before).execute();

更新行数をチェックしない

バージョンによる楽観的排他制御を行う場合、 更新できた行数が0だと javax.persistence.OptimisticLockException が発生します。 更新行数を正しく返さないJDBCドライバを使用する場合は、 suppresOptimisticLockException() を呼び出すことで、更新できた行数のチェックを行わなくなります。

int[] countArray = jdbcManager
    .updateBatch(employees)
    .suppresOptimisticLockException()
    .execute();

バッチ更新のサイズを指定する

バッチ更新のサイズを設定するには batchSize() を使います。

int[] countArray = jdbcManager.updateBatch(employees).batchSize(50).execute();

削除

1件削除

エンティティを削除する場合は、 delete()execute() を組み合わせます。

int count = jdbcManager.delete(employee).execute();

引数はエンティティで、戻り値は、更新した行数です。 削除するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。

バッチ削除

複数のエンティティをバッチ削除する場合は、 deleteBatch()execute() を組み合わせます。

int[] countArray = jdbcManager.deleteBatch(employees).execute();

引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 削除するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。

バージョンをチェックしないで削除する

バージョンをチェックしないで削除する場合は、 ignoreVersion() を使います。

int count = jdbcManager.delete(employee).ignoreVersion().execute();

削除行数をチェックしない

バージョンによる楽観的排他制御を行う場合、 削除できた行数が0だと javax.persistence.OptimisticLockException が発生します。 削除行数を正しく返さないJDBCドライバを使用する場合は、 suppresOptimisticLockException() を呼び出すことで、更新できた行数のチェックを行わなくなります。

int[] countArray = jdbcManager
    .deleteBatch(employees)
    .suppresOptimisticLockException()
    .execute();

バッチ削除のサイズを指定する

バッチ削除のサイズを設定するには batchSize() を使います。

int[] countArray = jdbcManager.updateDelete(employees).batchSize(50).execute();

ストアドの呼び出し

ストアドプロシージャの呼び出し

ストアドプロシージャを呼び出す場合は、 call()execute() を組み合わせます。 call() の最初の引数は、 呼び出すストアドプロシージャの名前です。

最初の例は、パラメータのない場合です。

jdbcManager.call("myproc").execute();

INのパラメータが1つだけで、そのパラメータが null にならない場合は、 call() の2番目の引数で値を直接指定します。

jdbcManager.call("myproc", "hoge").execute();

上記以外の場合は、 call() の2番目の引数にJavaBeansを指定します。 ストアドプロシージャを呼び出すパラメータの順番にJavaBeansのフィールドを定義します。

  • フィールドにアノテーションが付けられていない場合、 IN パラメータになります。
  • フィールドに @Out アノテーションが付けられている場合、 OUT パラメータになります。
  • フィールドに @InOut アノテーションが付けられている場合、 INOUT パラメータになります。
  • フィールドに @ResultSet アノテーションが付けられている場合、 パラメータ以外で戻される結果セットになります。 ただし、 OracleやPostgreSQLのように、 パラメータ以外で結果セットを返すことが出来ないRDBMSの場合は、 OUT パラメータとして扱われます。
  • フィールドに @Lob が付けられている場合、 そのパラメータはLOBとして扱われます。 @Lob アノテーションは他のアノテーションと組み合わせて使用することが出来ます。
public class MyDto {
    public String arg1; // 第1引数 (IN)

    @Out
    public String arg2; // 第2引数 (OUT)

    @InOut
    public int arg3;    // 第3引数 (INOUT)

    @ResultSet
    public List<String> result; // 結果セット
}
MyDto dto = new MyDto();
dto.arg1 = "hoge";
dto.arg3 = 2;
jdbcManager.call("myproc", dto).execute();
System.out.println(dto.arg2);
System.out.println(dto.arg3);
System.out.println(dto.result);

ストアドプロシージャが複数のカラムを持つ結果セットを返す場合は、 対応するフィールドの型をList<結果セットの行に対応するJavaBeansの型>にします。

public class MyDto {
    public int arg1; // 第1引数 (IN)

    @ResultSet
    public List<EmployeeDto> result; // 結果セット
}
MyDto dto = new MyDto();
dto.arg1 = 1;
jdbcManager.call("myproc", dto).execute();
System.out.println(dto.result);

オラクルとPostgreSQLの場合は、結果セットをパラメータで受け取る必要があります。 これらのRDBMSでは、 @ResultSet アノテーションが付けられたパラメータは OUT パラメータとして扱われます。

public class MyDto {
    public int arg1; // 第1引数 (IN)

    @ResultSet
    public List<EmployeeDto> result; // 第2引数 (OUT)
}
MyDto dto = new MyDto();
dto.arg1 = 1;
jdbcManager.call("myproc", dto).execute();
System.out.println(dto.result);

ストアドファンクションの呼び出し

ストアドファンクションを呼び出す場合は、 call() と、 getSingleResult() または getResultList() を組み合わせます。 call() の1番目の引数でストアドファンクションの戻り値の型を指定します。 2番目の引数でストアドファンクションの名前を指定します。

String result = jdbcManager.call(String.class, "myfunc")
                           .getSingleResult();

OracleやPostgreSQLのように、 ストアドファンクションの戻り値で結果セットを返すことが出来る場合は getResultList() で結果の List を受け取ります。 call() の1番目の引数で List の要素の型を指定します。

List<String> result = jdbcManager.call(String.class, "myfunc")
                                 .getResultList();

結果セットの行が複数のカラムを持つ場合は List の要素をJavaBeansにします。

List<MyDto> result = jdbcManager.call(MyDto.class, "myfunc")
                                .getResultList();

INのパラメータが1つだけで、そのパラメータが null にならない場合は、 call() の3番目の引数で値を直接指定します。

String result = jdbcManager.call(String.class, "myfunc", "hoge")
                           .getSingleResult();

上記以外の場合は、 call() の3番目の引数にJavaBeansを指定します。 ストアドファンクションを呼び出すパラメータの順番にJavaBeansのフィールドを定義します。

  • フィールドにアノテーションが付けられていない場合、 IN パラメータになります。
  • フィールドに @Out アノテーションが付けられている場合、 OUT パラメータになります。
  • フィールドに @InOut アノテーションが付けられている場合、 INOUT パラメータになります。
  • フィールドに @ResultSet アノテーションが付けられている場合、 パラメータ以外で戻される結果セットになります。 ただし、 OracleやPostgreSQLのように、 パラメータ以外で結果セットを返すことが出来ないRDBMSの場合は、 OUT パラメータとして扱われます。
  • フィールドに @Lob が付けられている場合、 そのパラメータはLOBとして扱われます。 @Lob アノテーションは他のアノテーションと組み合わせて使用することが出来ます。
public class MyDto {
    public String arg1; // 第1引数 (IN)

    @Out
    public String arg2; // 第2引数 (OUT)

    @InOut
    public int arg3;    // 第3引数 (INOUT)

    @ResultSet
    public List<String> result; // 結果セット
}
MyDto dto = new MyDto();
dto.arg1 = "hoge";
dto.arg3 = 2;
String result = jdbcManager.call(String.class, "myproc", dto)
                           .getSingleResult();
System.out.println(result);
System.out.println(dto.arg1);
System.out.println(dto.arg3);
System.out.println(dto.result);

ストアドファンクションが複数のカラムを持つ結果セットを返す場合は、 対応するフィールドの型をList<結果セットの行に対応するJavaBeansの型>にします。

public class MyDto {
    public int arg1; // 第1引数 (IN)

    @ResultSet
    public List<EmployeeDto> result; // 結果セット
}
MyDto dto = new MyDto();
dto.arg1 = 1;
String result = jdbcManager.call(String.class, "myfunc", dto)
                           .getSingleResult();
System.out.println(result);
System.out.println(dto.result);

オラクルとPostgreSQLの場合は、戻り値以外の結果セットをパラメータで受け取る必要があります。 これらのRDBMSでは、 @ResultSet アノテーションが付けられたパラメータは OUT パラメータとして扱われます。

public class MyDto {
    public int arg1; // 第1引数 (IN)

    @ResultSet
    public List<EmployeeDto> result; // 第2引数 (OUT)
}
MyDto dto = new MyDto();
dto.arg1 = 1;
String result = jdbcManager.call(String.class, "myfunc", dto)
                           .getSingleResult();
System.out.println(result);
System.out.println(dto.result);