検索
複数件検索
複数件を検索する場合は、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();
イテレーションによる検索
検索結果が多くの行を返すため、
List
でまとめて受け取ることが困難な場合は
iterate(IterationCallback)
を使います。
int count = results = jdbcManager .from(Employee.class) .iterate(new IterationCallback<BeanMap, Integer>() { int count; public Integer iterate(BeanMap map, IterationContext context) { if (...) { ++count; } return count; } });
iterate(IterationCallback)
の引数には、 次のインターフェースを実装したクラスのインスタンスを渡します。
org.seasar.extension.jdbc.IterationCallback<ENTITY, RESULT>
ENTITY
は
from()
で指定したエンティティクラス、
RESULT
は
iterate(IterationCallback)
が返す結果の型を指定します。
from()
で指定したエンティティ1件ごとに次のメソッドがコールバックされます。
RESULT iterate(ENTITY entity, IterationContext context)
コールバックメソッドが最後に返した値が
iterate(IterationCallback)
の戻り値となります。
コールバックメソッドの第2引数で渡される
org.seasar.extension.jdbc.IterationContext
の
exit
プロパティを
true
にすると、 問い合わせ結果のイテレーションは終了となり、 検索結果の残りは無視されます。
その時の戻り値が
iterate(IterationCallback)
の戻り値となります。
1対多関連を
結合
する場合は、
from()
で指定したエンティティで
ソート
して、結果セットが次のような順になるようにします。
from()
で指定したエンティティ
|
結合したエンティティ |
---|---|
A1 | B1 |
A1 | B2 |
A2 | B1 |
A2 | B2 |
上記のような結果セットの場合、 コールバックメソッドはA1とA2が1回ずつ、 計2回呼び出されます。 A1に関連づけられたB1およびB2のインスタンスと、 A2に関連づけられたB1およびB2のインスタンスは異なります(同じ値を持つが同一ではない)。
from()
で指定したエンティティ
|
結合したエンティティ |
---|---|
A1 | B1 |
A2 | B1 |
A1 | B2 |
A2 | B2 |
結果セットが上記のような順になっている場合、 コールバックメソッドは4回呼び出されてしまいます。
検索結果の行数取得
SELECT COUNT(*) ~による検索結果の行数を取得する場合は、getCount()を使います。
long count = jdbcManager.from(Employee.class).getCount();
getCount()
が返す値は問い合わせ結果の行数であり、 同等の問い合わせを行った場合に
getResultList()
が返すエンティティの数と一致するとは限りません。
from()
で指定したエンティティに
1対多関連
を
結合
した場合、
getCount()
が返す行数は
getResultList()
が返すエンティティの数よりも多くなる場合があります。
結合
他のエンティティを結合する場合は、次のメソッドを使用します。
innerJoin(String name)
innerJoin(String name, boolean fetch)
leftOuterJoin(String name)
leftOuterJoin(String name, boolean fetch)
第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();
結合条件の追加
追加の結合条件を指定することもできます。
追加の結合条件をSQL文字列で指定する場合は、次のメソッドを使用します。
innerJoin(String name, String condition, Object... params)
innerJoin(String name, boolean fetch, String condition, Object... params)
leftOuterJoin(String name, String condition, Object... params)
leftOuterJoin(String name, boolean fetch, String condition, Object... params)
引数condition
に指定できる条件は、SQLと同じです。
SQLとの違いは、カラム名の代わりにプロパティ名を書くことです。
関連先のプロパティを指定する場合は、innerJoin()/leftOuterJoin()で指定した名前.
プロパティ名になります。
List<Department> results = jdbcManager.from(Department.class) .leftOuterJoin("employee", "employee.salary > ?", 1000) .getResultList();
指定方法の詳細は「 SQL文字列による指定 」を参照してください。
追加の結合条件を
SimpleWhere
で指定する場合は、次のメソッドを使用します。
innerJoin(String name, Where condition)
innerJoin(String name, boolean fetch, Where condition)
leftOuterJoin(String name, Where condition)
leftOuterJoin(String name, boolean fetch, Where condition)
List<Department> results = jdbcManager.from(Department.class) .leftOuterJoin("employee", new SimpleWhere().gt("employee.salary", 1000)) .getResultList();
指定方法の詳細は「 SimpleWhereによる指定 」を参照してください。
結合のネスト
結合は、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.Date
・
java.util.Calendar
型のパラメータを指定する場合は、時制を指定することができます。 時制の指定は
org.seasar.extension.jdbc.parameter.Parameter
のstaticメソッドを使います。
date(Date)
またはdate(Calendar)
- パラメータをSQL標準のDATE型 (日付のみ) として扱います。
time(Date)
またはtime(Calendar)
- パラメータをSQL標準のTIME型 (時刻のみ) として扱います。
timestamp(Date)
またはtimestamp(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の時は追加されません。
|
excludesWhitespace() | valueが空白文字列の時は条件に追加されません。 |
Mapによる指定
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();
排他制御とページングを組み合わせることはできません。
limit()
で指定する値は問い合わせ結果の行数であり、
getResultList()
が返すエンティティの数と一致するとは限りません。
from()
で指定したエンティティに
1対多関連
を
結合
した場合、
getResultList()
が返すエンティティの数は
limit()
で指定した数よりも少なくなる場合があります。
最大行数
最大行数を指定する場合は、
maxRows()
を使います。 最大行数を超える行は、通知なしに除外されます。
jdbcManager.from(Employee.class) .maxRows(1000) .getResultList();
フェッチサイズ
フェッチサイズを指定する場合は、
fetchSize()
を使います。
jdbcManager.from(Employee.class) .fetchSize(100) .getResultList();
クエリタイムアウト
クエリタイムアウト(秒)を指定する場合は、
queryTimeout()
を使います。
jdbcManager.from(Employee.class) .queryTimeout(10) .getResultList();
ヒント
コメントによるヒントを指定する場合は、
hint()
を使います。
jdbcManager.from(Employee.class) .hint("INDEX(Employee IDX1)") .getResultList();
ヒント中のエンティティ名(上記例では
Employee
)は別名に置換され、 Oracleでは次のようなコメントがSQLに含まれます。
/*+ INDEX(T1_ IDX1) */
ヒント中の関連プロパティ名も別名に置換されます。
jdbcManager.from(Employee.class) .leftOuterJoin("department") .hint("INDEX(department IDX2)") .getResultList();
上記の場合、 Oracleでは次のようなコメントがSQLに含まれます。
/*+ INDEX(T2_ IDX2) */
コメントによるヒントをサポートしていないRDBMSの場合、
hint()
は無視され、 SQLにコメントは付加されません。
挿入
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();
更新
1件更新
エンティティを更新する場合は、
update()
と
execute()
を組み合わせます。
int count = jdbcManager.update(employee).execute();
引数はエンティティで、戻り値は、更新した行数です。 更新するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
注意点
識別子定義 のないエンティティは、 SQL自動生成による更新は出来ません。
バッチ更新
複数のエンティティをバッチ更新する場合は、
updateBatch()
と
execute()
を組み合わせます。
int[] countArray = jdbcManager.updateBatch(employees).execute();
引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 更新するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
注意点
識別子定義 のないエンティティは、 SQL自動生成によるバッチ更新は出来ません。
バージョンプロパティを通常の更新対象にする
バージョンプロパティを通常の更新対象に含め、バージョンチェックの対象外にする場合は、
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();
削除
1件削除
エンティティを削除する場合は、
delete()
と
execute()
を組み合わせます。
int count = jdbcManager.delete(employee).execute();
引数はエンティティで、戻り値は、更新した行数です。 削除するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
注意点
識別子定義 のないエンティティは、 SQL自動生成による削除は出来ません。
バッチ削除
複数のエンティティをバッチ削除する場合は、
deleteBatch()
と
execute()
を組み合わせます。
int[] countArray = jdbcManager.deleteBatch(employees).execute();
引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 削除するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
注意点
識別子定義 のないエンティティは、 SQL自動生成によるバッチ削除は出来ません。
バージョンをチェックしないで削除する
バージョンをチェックしないで削除する場合は、
ignoreVersion()
を使います。
int count = jdbcManager.delete(employee).ignoreVersion().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);