複数件を検索する場合は、
gerResultList()
を使います。
検索するエンティティは、
from()
で指定します。
デフォルトでは、結果がなかった場合は、 空の
List
が返されます。
disallowNoResult()
を呼び出すと、 結果がなかった場合は
javax.persistence.NoResultException
が発生します。
1件検索する場合は、
getSingleResult()
を使います。
結果が複数件になる場合は、
javax.persistence.NonUniqueResultException
が発生します。
デフォルトでは、結果がなかった場合は、
null
が返されます。
disallowNoResult()
を呼び出すと、 結果がなかった場合は
javax.persistence.NoResultException
が発生します。
検索結果が多くの行を返すため、
List
でまとめて受け取ることが困難な場合は
iterate(IterationCallback)
を使います。
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()
を使います。
getCount()
が返す値は問い合わせ結果の行数であり、 同等の問い合わせを行った場合に
getResultList()
が返すエンティティの数と一致するとは限りません。
from()
で指定したエンティティに
1対多関連
を
結合
した場合、
getCount()
が返す行数は
getResultList()
が返すエンティティの数よりも多くなる場合があります。
他のエンティティを結合する場合は、次のメソッドを使用します。
innerJoin(CharSequence name)
innerJoin(CharSequence name, boolean fetch)
leftOuterJoin(CharSequence name)
leftOuterJoin(CharSequence name, boolean
fetch)
第1引数は、結合したいエンティティのプロパティ名です。
次のように外部結合にすることもできます。
検索条件には含めたいけど、検索結果には含めたくない場合、 2番名の引数をfalseにします。
追加の結合条件を指定することもできます。
追加の結合条件をSQL文字列で指定する場合は、次のメソッドを使用します。
innerJoin(CharSequence name, String condition,
Object... params)
innerJoin(CharSequence name, boolean fetch,
String condition, Object... params)
leftOuterJoin(CharSequence name, String
condition, Object... params)
leftOuterJoin(CharSequence name, boolean
fetch, String condition, Object...
params)
引数
condition
に指定できる条件は、SQLと同じです。 SQLとの違いは、カラム名の代わりにプロパティ名を書くことです。
関連先のプロパティを指定する場合は、
innerJoin()/leftOuterJoin()
で指定した名前.
プロパティ名になります。
指定方法の詳細は「 SQL文字列による指定 」を参照してください。
追加の結合条件を
SimpleWhere
で指定する場合は、次のメソッドを使用します。
innerJoin(CharSequence name, Where condition)
innerJoin(CharSequence name, Where... conditions)
innerJoin(CharSequence name, boolean fetch,
Where condition)
innerJoin(CharSequence name, boolean fetch,
Where... conditions)
leftOuterJoin(CharSequence name, Where
condition)
leftOuterJoin(CharSequence name, Where...
conditions)
leftOuterJoin(CharSequence name, boolean
fetch, Where condition)
leftOuterJoin(CharSequence name, boolean
fetch, Where... conditions)
指定方法の詳細は「 SimpleWhereによる指定 」を参照してください。
結合は、employee.addressのようにネストすることもできます。 ネストする場合は、必ずベースとなる結合を先に指定します。 employee.addressの場合、employeeがベースとなる結合です。
結合は、多対一関連、一対多関連、一対一関連のどれでも可能で、 いくつでもネストすることが可能です。
IDプロパティ (主キー) を指定して検索対象を指定する場合は、
id(Object...)
を使います。 引数はエンティティに定義されたIDプロパティと同じ数・同じ並びで指定します。
IDと同時にバージョンを指定することもできます。 バージョンプロパティを指定する場合は、
version(Object)
を使います。
IDを指定しないでバージョンだけを指定することはできません。
より複雑な検索条件を指定する場合は、
where(String criteria, Object... params)
を使います。
where(String criteria, Object... params)
に書くことのできる条件は、SQLと同じです。
SQLとの違いは、カラム名の代わりにプロパティ名を書くことです。
関連先のプロパティを指定する場合は、
innerJoin()/leftOuterJoin()
で指定した名前.プロパティ名になります。
java.util.Date
・
java.util.Calendar
型のパラメータを指定する場合は、時制を指定することができます。 時制の指定は
org.seasar.extension.jdbc.parameter.Parameter
のstaticメソッドを使います。
date(Date)
または
date(Calendar)
time(Date)
または
time(Calendar)
timestamp(Date)
または
timestamp(Calendar)
byte[]
・
String
型のパラメータを指定する場合は、ラージオブジェクトであることを指定することができます。
ラージオブジェクトの指定は
org.seasar.extension.jdbc.parameter.Parameter
のstaticメソッドを使います。
lob(String)
lob(byte[])
または
lob(Serializable)
検索条件の入力画面などでは、ユーザの入力があった部分をandでつないで、 条件を組み立てるということが良く行われます。 このようなケースを簡単に処理するために、 SimpleWhereとMapでも、検索条件を指定できるようにしています。
名前、仕事タイプ、給与の上限下限を条件に検索する画面を考えてみましょう。 べたに検索条件を組み立てるとはこんな感じになるはずです。
SimpleWhereを使って組み立てれば、こんなに簡単になります。
SimpleWhereには次のメソッドがあります。
メソッド | 説明 |
---|---|
eq(CharSequence propertyName, Object value)
|
propertyName = ?
の条件を追加します。valueがnullの時は追加されません。
|
ne(CharSequence propertyName, Object value)
|
propertyName <> ?
の条件を追加します。valueがnullの時は追加されません。
|
lt(CharSequence propertyName, Object value)
|
propertyName < ?
の条件を追加します。valueがnullの時は追加されません。
|
le(CharSequence propertyName, Object value)
|
propertyName <= ?
の条件を追加します。valueがnullの時は追加されません。
|
gt(CharSequence propertyName, Object value)
|
propertyName > ?
の条件を追加します。valueがnullの時は追加されません。
|
ge(CharSequence propertyName, Object value)
|
propertyName >= ?
の条件を追加します。valueがnullの時は追加されません。
|
in(CharSequence propertyName, Object... values)
|
propertyName in (?, ...)
の条件を追加します。 valuesがnullの時または配列の長さが0の時は追加されません。
|
in(CharSequence propertyName, Collection<?> values)
|
propertyName in (?, ...)
の条件を追加します。 valuesがnullの時またはリストの長さが0の時は追加されません。
|
notIn(CharSequence propertyName, Object... values)
|
propertyName not in (?, ...)
の条件を追加します。 valuesがnullの時または配列の長さが0の時は追加されません。
|
notIn(CharSequence propertyName, Collection<?> values)
|
propertyName not in (?, ...)
の条件を追加します。 valuesがnullの時またはリストの長さが0の時は追加されません。
|
like(CharSequence propertyName, String value)
|
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
|
like(CharSequence propertyName, String value, char escape)
|
propertyName like ? escape ?
の条件を追加します。 valueがnullの時は追加されません。
|
notLike(CharSequence propertyName, String value)
|
propertyName not like ?
の条件を追加します。 valueがnullの時は追加されません。
|
notLike(CharSequence propertyName, String value, char escape)
|
propertyName not like ? escape ?
の条件を追加します。 valueがnullの時は追加されません。
|
starts(CharSequence propertyName, String value)
|
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最後に自動的に
%
が追加されます。 valueに
'%', '_'
が含まれる場合はエスケープされます。
|
notStarts(CharSequence propertyName, String value)
|
propertyName not like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最後に自動的に
%
が追加されます。 valueに
'%', '_'
が含まれる場合はエスケープされます。
|
ends(CharSequence propertyName, String value)
|
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最初に自動的に
%
が追加されます。 valueに
'%', '_'
が含まれる場合はエスケープされます。
|
notEnds(CharSequence propertyName, String value)
|
propertyName not like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最初に自動的に
%
が追加されます。 valueに
'%', '_'
が含まれる場合はエスケープされます。
|
contains(CharSequence propertyName, String value)
|
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最初と最後に自動的に
%
が追加されます。 valueに
'%', '_'
が含まれる場合はエスケープされます。
|
notContains(CharSequence propertyName, String value)
|
propertyName not like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最初と最後に自動的に
%
が追加されます。 valueに
'%', '_'
が含まれる場合はエスケープされます。
|
isNull(CharSequence propertyName, Boolean value)
|
propertyName is null
の条件を追加します。
valueがnullあるいはBoolean.FALSEの時は追加されません。
|
isNotNull(CharSequence propertyName, Boolean value)
|
propertyName is not null
の条件を追加します。
valueがnullあるいはBoolean.FALSEの時は追加されません。
|
excludesWhitespace()
|
valueが空白文字列の時は条件に追加されません。 |
Mapを使うと次のようになります。
org.seasar.extension.jdbc.parameter.Parameter
のstaticメソッドを使うと、流れるようなインタフェースでMapを組み立てることも出来ます。
マップのキーにプロパティ名_サフィックスを指定します。 サフィックスがない場合は、
_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 (?, ...)
の条件を追加します。
値は配列または
java.util.Collection
をサポートしています。
valueがnullの時または長さが0の時は追加されません。
|
_NOT_IN |
propertyName not in (?, ...)
の条件を追加します。
値は配列または
java.util.Collection
をサポートしています。
valueがnullの時または長さが0の時は追加されません。
|
_LIKE |
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
|
_NOT_LIKE |
propertyName not like ?
の条件を追加します。 valueがnullの時は追加されません。
|
_STARTS |
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最後に自動的に
%
が追加されます。
|
_NOT_STARTS |
propertyName not like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最後に自動的に
%
が追加されます。
|
_ENDS |
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最初に自動的に
%
が追加されます。
|
_NOT_ENDS |
propertyName not like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最初に自動的に
%
が追加されます。
|
_CONTAINS |
propertyName like ?
の条件を追加します。 valueがnullの時は追加されません。
valueの最初と最後に自動的に
%
が追加されます。
|
_NOT_CONTAINS |
propertyName not 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)
の引数には、プロパティ名のプレフィックスを指定します。
プレフィックスを指定した場合、プレフィックスを持つプロパティだけが対象になります。
プロパティ名がマップのキーに変換されるときに、 プレフィックスは削除され、'$'は'.'に変換されます。
ソート順を指定する場合は、
orderBy()
を使います。
orderBy()
に書くことのできる条件は、SQLと同じです。
SQLとの違いは、カラム名の代わりにプロパティ名を書くことです。
関連先のプロパティを指定する場合は、
innerJoin()/leftOuterJoin()
で指定した名前.プロパティ名になります。
orderBy(OrderByItem... orderByItems)
を使うこともできます。
OrderByItems
はソート順のキーとなるプロパティ名と昇順または降順を示すもので、
org.seasar.extension.jdbc.operation.Operations
のメソッド
asc(CharSequence propertyName)
および
desc(CharSequence propertyName)
を使って次のように指定することができます。
SELECT時にロックを取得する場合は、
forUpdate()
forUpdate(CharSequence... propertyNames)
forUpdateNowait()
forUpdateNowait(CharSequence... propertyNames)
forUpdateWait(int seconds)
forUpdateWait(int seconds, CharSequence... propertyNames)
を使います。 全てのRDBMSでこれらの操作が利用できるわけではありません。
サポートされていないメソッドを呼び出すと
UnsupportedOperationException
がスローされます。
forUpdate(String...)
・
forUpdateNowait(String...)
の第1引数および
forUpdateWait(int, String...)
の第2引数には、ロック対象となるプロパティ名を指定します。
forUpdateWait(int)
・
forUpdateWait(int, String...)
の第1引数では、ロックを獲得できるまでの最大待機時間を秒単位で指定します。
以下の例では、Employee
とDepartment
を結合していて、
ロック対象のプロパティが明示されていないので、両テーブルのロックが取得されます。
以下の例でもEmployee
とDepartment
を結合していますが、
指定されたプロパティを持つEmployee
のロックのみが取得されます。
排他制御とページングを組み合わせることはできません。
指定したプロパティのみを検索結果に含める場合は、
includes()
を使います。
ただし、
@Id
アノテーションが付けられたプロパティは無条件で検索結果に含まれます。
不要なプロパティを検索結果から除外することで、
データベースから転送されるデータ量やJVMのメモリ使用量を減らすことができます。
次のように結合するエンティティのプロパティを指定することもできます。
結合するエンティティへの関連プロパティを指定した場合、
関連先のエンティティが持つプロパティはすべて検索結果に含まれます。
ただし、関連先のエンティティが持つプロパティが
excludes()
に指定された場合、そのプロパティは検索結果から除外されます。
次の例では、関連プロパティ
department
が
includes()
に指定されているため、
Department
エンティティの持つ各プロパティが取得されます。
ただし、
excludes()
に
department.name
が指定されているため、
Department
の
name
プロパティは取得されません。
フェッチ対象外定義
を指定したプロパティを
includes()
に指定すると、そのプロパティを
eager()
で指定していなくても検索結果に含まれます。
ただし、
フェッチ対象外定義
を指定したプロパティそのものではなく、そのプロパティを含むエンティティへの関連プロパティを
includes()
に指定した場合は、その関連先エンティティに含まれている
フェッチ対象外定義
のプロパティは、
eager()
で指定されたものだけが検索結果に含まれます。
includes()
または
excludes()
を指定して取得したインスタンスを更新に使用する場合、
更新時に同様の
includes()
を指定しないと検索結果に含めなかったカラムがすべて空の値で更新されます。
excludesNull()
や
changedFrom()
を指定して更新対象外にすることも可能です。
指定したプロパティを検索結果から除外する場合は、
excludes()
を使います。
ただし、
@Id
アノテーションが付けられたプロパティは無条件で検索結果に含まれます。
不要なプロパティを検索結果から除外することで、
データベースから転送されるデータ量やJVMのメモリ使用量を減らすことができます。
includes()
に同じプロパティを指定した場合、
includes()
の指定が優先されます。
次のように結合するエンティティのプロパティを指定することもできます。
次のように結合するエンティティへの関連プロパティを指定した場合、 関連先のエンティティが持つプロパティはすべて検索結果から除外されます。
フェッチ対象外定義
を指定したプロパティや、そのプロパティを含むエンティティへの関連プロパティを
excludes()
に指定すると、そのプロパティを
eager()
で指定していても検索結果には含まれません。
includes()
または
excludes()
を指定して取得したインスタンスを更新に使用する場合、
更新時に同様の
includes()
または
excludes()
を指定しないと検索結果に含めなかったカラムがすべて空の値で更新されます。
excludesNull()
や
changedFrom()
を指定して更新対象外にすることも可能です。
フェッチ対象外定義
を指定したプロパティをフェッチ対象にする (検索結果に含む) には、
eager(CharSequence... propertyNames)
を使います。
関連先のプロパティを指定する場合は、
innerJoin()/leftOuterJoin()
で指定した名前.プロパティ名になります。
eager()
と
includes()
は、同時に使わないことを推奨します。
フェッチ対象外定義
が指定されたプロパティを
includes()
に指定すると、そのプロパティを
eager()
で指定しなくても検索結果に含まれます。
そのため、
includes()
を使う場合は
eager()
を使う必要はありません。
eager()
は、
フェッチ対象外定義
の指定を打ち消す効果があります。その後で
includes()
/
excludes()
が適用されます。
フェッチ対象外定義
を指定したプロパティを
eager()
に指定しても、
includes()
の指定がある場合は、そのプロパティまたは、そのプロパティを含むエンティティへの関連プロパティが
includes()
に含まれていないと検索結果には含まれません。
フェッチ対象外定義
を指定したプロパティを
eager()
に指定しても、そのプロパティまたは、そのプロパティを含むエンティティへの関連プロパティが
excludes()
に含まれていると検索結果には含まれません。
ページングを指定する場合は、
limit(), offset()
を使います。
limit()
には、取得する行数を指定します。
offset()
には、最初に取得する行の位置を指定します。 最初の行の位置は0になります。
ページングを指定するには、必ず
ソート順
の指定も必要です。
排他制御とページングを組み合わせることはできません。
limit()
で指定する値は問い合わせ結果の行数であり、
getResultList()
が返すエンティティの数と一致するとは限りません。
from()
で指定したエンティティに
1対多関連
を
結合
した場合、
getResultList()
が返すエンティティの数は
limit()
で指定した数よりも少なくなる場合があります。
最大行数を指定する場合は、
maxRows()
を使います。 最大行数を超える行は、通知なしに除外されます。
フェッチサイズを指定する場合は、
fetchSize()
を使います。
クエリタイムアウト(秒)を指定する場合は、
queryTimeout()
を使います。
コメントによるヒントを指定する場合は、
hint()
を使います。
ヒント中のエンティティ名(上記例では
Employee
)は別名に置換され、 Oracleでは次のようなコメントがSQLに含まれます。
ヒント中の関連プロパティ名も別名に置換されます。
上記の場合、 Oracleでは次のようなコメントがSQLに含まれます。
コメントによるヒントをサポートしていないRDBMSの場合、
hint()
は無視され、 SQLにコメントは付加されません。
エンティティを挿入する場合は、
insert()
と
execute()
を組み合わせます。
引数はエンティティで、戻り値は、更新した行数です。 挿入するときに、識別子を自動設定することができます。 詳しくは、 識別子定義 を参照してください。
一意制約違反によりエンティティ挿入ができなかった場合は、
javax.persistence.EntityExistsException
が発生します。
複数のエンティティをバッチ挿入する場合は、
insertBatch()
と
execute()
を組み合わせます。
引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 挿入するときに、識別子を自動設定することができます。 詳しくは、 識別子定義 を参照してください。
一意制約違反によりエンティティを挿入ができなかった場合は、
javax.persistence.EntityExistsException
が発生します。
挿入の対象からnullの項目を除外する場合は、
excludesNull()
を使います。 バッチ系の挿入は、すべてのエンティティに同じSQLを適用しなければならないので、
null
を除外してバッチ挿入することはできません。
なぜなら、すべてのエンティティの
null
の項目が同じだとは限らないからです。
指定したプロパティのみを挿入対象にする場合は、
includes()
を使います。
指定したプロパティを挿入対象から除外する場合は、
excludes()
を使います。
バッチ挿入のサイズを設定するには
batchSize()
を使います。
エンティティを更新する場合は、
update()
と
execute()
を組み合わせます。
引数はエンティティで、戻り値は、更新した行数です。 更新するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
識別子定義 のないエンティティは、 SQL自動生成による更新は出来ません。
複数のエンティティをバッチ更新する場合は、
updateBatch()
と
execute()
を組み合わせます。
引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 更新するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
識別子定義 のないエンティティは、 SQL自動生成によるバッチ更新は出来ません。
バージョンプロパティを通常の更新対象に含め、バージョンチェックの対象外にする場合は、
includesVersion()
を使います。
更新の対象からnullの項目を除外する場合は、
excludesNull()
を使います。 バッチ系の更新は、すべてのエンティティに同じSQLを適用しなければならないので、
null
を除外してバッチ更新することはできません。
なぜなら、すべてのエンティティの
null
の項目が同じだとは限らないからです。
指定したプロパティのみを更新対象にする場合は、
includes()
を使います。
指定したプロパティを更新対象から除外する場合は、
excludes()
を使います。
変更のあったプロパティのみを更新対象にする場合は、
changedFrom()
を使います。バッチ系の更新は、すべてのエンティティに同じSQLを適用しなければならないので、
変更のあったプロパティのみをバッチ更新することはできません。
なぜなら、変更のあったプロパティがすべてのエンティティで同じだとは限らないからです。
最初の引数は、変更前の状態を持ったエンティティもしくはマップです。
JdbcManager#update()
に渡されたエンティティと,
changedFrom()
に渡されたエンティティまたはマップに相違がない場合、SQLは実行されず、
execute()
の戻り値の更新行数として0が返されます。
バージョンによる楽観的排他制御を行う場合、 更新できた行数が0だと
javax.persistence.OptimisticLockException
が発生します。 更新行数を正しく返さないJDBCドライバを使用する場合は、
suppresOptimisticLockException()
を呼び出すことで、更新できた行数のチェックを行わなくなります。
バッチ更新のサイズを設定するには
batchSize()
を使います。
エンティティを削除する場合は、
delete()
と
execute()
を組み合わせます。
引数はエンティティで、戻り値は、更新した行数です。 削除するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
識別子定義 のないエンティティは、 SQL自動生成による削除は出来ません。
複数のエンティティをバッチ削除する場合は、
deleteBatch()
と
execute()
を組み合わせます。
引数はエンティティのリストあるいは配列(可変長引数)で、戻り値は、更新した行数の配列です。 削除するときに、バージョンによる楽観的排他制御をすることができます。 詳しくは、 バージョン定義 を参照してください。
識別子定義 のないエンティティは、 SQL自動生成によるバッチ削除は出来ません。
バージョンをチェックしないで削除する場合は、
ignoreVersion()
を使います。
バージョンによる楽観的排他制御を行う場合、 削除できた行数が0だと
javax.persistence.OptimisticLockException
が発生します。 削除行数を正しく返さないJDBCドライバを使用する場合は、
suppresOptimisticLockException()
を呼び出すことで、更新できた行数のチェックを行わなくなります。
バッチ削除のサイズを設定するには
batchSize()
を使います。
ストアドプロシージャを呼び出す場合は、
call()
と
execute()
を組み合わせます。
call()
の最初の引数は、 呼び出すストアドプロシージャの名前です。
最初の例は、パラメータのない場合です。
INのパラメータが1つだけで、そのパラメータが
null
にならない場合は、
call()
の2番目の引数で値を直接指定します。
上記以外の場合は、
call()
の2番目の引数にJavaBeansを指定します。
ストアドプロシージャを呼び出すパラメータの順番にJavaBeansのフィールドを定義します。
S2JDBCは、ソースコード上に記述したフィールドの順番と、 コンパイルされた.classファイル内のフィールドの順番が同じになることを前提としていますが、 これはJavaの仕様では保証されていません. SunのJDKやEclipseではソースコード上と.classファイル内のフィールド順は同じになっていますが、 フィールドの順番が変わってしまう環境ではストアドの呼び出しが失敗します。 フィールドの順番が変わってしまう環境があった場合は Seasar-userメーリングリスト までお知らせください.
IN
パラメータになります。
@Out
アノテーションが付けられている場合、
OUT
パラメータになります。
@InOut
アノテーションが付けられている場合、
INOUT
パラメータになります。
@ResultSet
アノテーションが付けられている場合、 パラメータ以外で戻される結果セットになります。
ただし、 OracleやPostgreSQLのように、
パラメータ以外で結果セットを返すことが出来ないRDBMSの場合は、
OUT
パラメータとして扱われます。
@Lob
が付けられている場合、 そのパラメータはLOBとして扱われます。
@Lob
アノテーションは他のアノテーションと組み合わせて使用することが出来ます。
ストアドプロシージャが複数のカラムを持つ結果セットを返す場合は、
対応するフィールドの型を
List<結果セットの行に対応するJavaBeansの型>
にします。
オラクルとPostgreSQLの場合は、結果セットをパラメータで受け取る必要があります。
これらのRDBMSでは、
@ResultSet
アノテーションが付けられたパラメータは
OUT
パラメータとして扱われます。
ストアドファンクションを呼び出す場合は、
call()
と、
getSingleResult()
または
getResultList()
を組み合わせます。
call()
の1番目の引数でストアドファンクションの戻り値の型を指定します。
2番目の引数でストアドファンクションの名前を指定します。
OracleやPostgreSQLのように、
ストアドファンクションの戻り値で結果セットを返すことが出来る場合は
getResultList()
で結果の
List
を受け取ります。
call()
の1番目の引数で
List
の要素の型を指定します。
結果セットの行が複数のカラムを持つ場合は
List
の要素をJavaBeansにします。
INのパラメータが1つだけで、そのパラメータが
null
にならない場合は、
call()
の3番目の引数で値を直接指定します。
上記以外の場合は、
call()
の3番目の引数にJavaBeansを指定します。
ストアドファンクションを呼び出すパラメータの順番にJavaBeansのフィールドを定義します。
S2JDBCは、ソースコード上に記述したフィールドの順番と、 コンパイルされた.classファイル内のフィールドの順番が同じになることを前提としていますが、 これはJavaの仕様では保証されていません. SunのJDKやEclipseではソースコード上と.classファイル内のフィールド順は同じになっていますが、 フィールドの順番が変わってしまう環境ではストアドの呼び出しが失敗します。 フィールドの順番が変わってしまう環境があった場合は Seasar-userメーリングリスト までお知らせください.
フィールドにアノテーションが付けられていない場合、
IN
パラメータになります。
フィールドに
@Out
アノテーションが付けられている場合、
OUT
パラメータになります。
フィールドに
@InOut
アノテーションが付けられている場合、
INOUT
パラメータになります。
フィールドに
@ResultSet
アノテーションが付けられている場合、 パラメータ以外で戻される結果セットになります。
ただし、 OracleやPostgreSQLのように、
パラメータ以外で結果セットを返すことが出来ないRDBMSの場合は、
OUT
パラメータとして扱われます。
フィールドに
@Lob
が付けられている場合、 そのパラメータはLOBとして扱われます。
@Lob
アノテーションは他のアノテーションと組み合わせて使用することが出来ます。
ストアドファンクションが複数のカラムを持つ結果セットを返す場合は、
対応するフィールドの型を
List<結果セットの行に対応するJavaBeansの型>
にします。
オラクルとPostgreSQLの場合は、戻り値以外の結果セットをパラメータで受け取る必要があります。
これらのRDBMSでは、
@ResultSet
アノテーションが付けられたパラメータは
OUT
パラメータとして扱われます。