@Published public final class UniversalDao extends java.lang.Object
Entity
Table
Column
Id
Version
Temporal
GeneratedValue
SequenceGenerator
TableGenerator
Modifier and Type | Class and Description |
---|---|
static class |
UniversalDao.Transaction
トランザクション境界を作るためのクラス。
通常の業務トランザクションと異なるトランザクションでデータベースアクセスを行いたい場合、
本クラスを継承することで別トランザクション内で
UniversalDao を使用することができる。
|
Modifier and Type | Method and Description |
---|---|
static <T> void |
batchDelete(java.util.List<T> entities)
与えられたエンティティオブジェクトからデリート文を生成し一括実行する。
エンティティの主キーが削除条件となるため、主キー値以外のフィールドの値の有無は動作に影響しない。
|
static <T> void |
batchInsert(java.util.List<T> entities)
与えられたエンティティリストオブジェクトからインサート文を生成し一括実行する。
エンティティオブジェクトにてnullであるプロパティに対応するカラムは、そのままnullで登録される。
GeneratedValue が付与されているプロパティは採番された値が登録される。
Version が付与されたversionカラムに対して明示的に値を設定していたとしても、
「0」で上書きされてinsertされる。 |
static <T> void |
batchUpdate(java.util.List<T> entities)
与えられたエンティティ情報からアップデート文を生成し一括実行する。
バージョン番号を用いた排他制御処理は行わない。
排他制御を必要とする場合には、
update(Object) を使用すること。
もし、更新時にバージョン番号が不一致のエンティティオブジェクトが存在した場合、
そのレコードは更新されずに処理が正常に終了する。 |
static <T> long |
countBySqlFile(java.lang.Class<T> entityClass,
java.lang.String sqlId)
SQL_IDをもとに検索し、件数を取得する。
検索の詳細は
countBySqlFile(Class, String, Object) を参照すること。 |
static <T> long |
countBySqlFile(java.lang.Class<T> entityClass,
java.lang.String sqlId,
java.lang.Object params)
SQL_IDをもとにバインド変数を展開して検索し、件数を取得する。
検索用のSQLを件数取得用のSQLへと変換して実行されるため、個別に件数取得用のSQLを作成する必要はない。
|
static DaoContext |
defer()
検索結果の取得を遅延させる。
大量データを検索する場合でもヒープを圧迫することなく安全に検索結果を扱うことができる。
|
static <T> int |
delete(T entity)
与えられたエンティティオブジェクトからデリート文を生成し実行する。
エンティティの主キーが削除条件となるため、主キー値以外のフィールドの値の有無は動作に影響しない。
|
static <T> boolean |
exists(java.lang.Class<T> entityClass,
java.lang.String sqlId)
SQL_IDをもとに検索し、データが存在するか否かを確認する。
検索の詳細は
exists(Class, String, Object) を参照すること。
|
static <T> boolean |
exists(java.lang.Class<T> entityClass,
java.lang.String sqlId,
java.lang.Object params)
SQL_IDをもとにバインド変数を展開して検索し、データが存在するか否かを確認する。
検索用のSQLを変換して使用する。
|
static <T> EntityList<T> |
findAll(java.lang.Class<T> entityClass)
すべてのエンティティを取得する。
|
static <T> EntityList<T> |
findAllBySqlFile(java.lang.Class<T> entityClass,
java.lang.String sqlId)
SQL_IDをもとに検索し、結果Beanのリストに格納して取得する。
検索の詳細は
findAllBySqlFile(Class, String, Object) を参照すること。 |
static <T> EntityList<T> |
findAllBySqlFile(java.lang.Class<T> entityClass,
java.lang.String sqlId,
java.lang.Object params)
SQL_IDをもとにバインド変数を展開した上で検索し、結果Beanのリストに格納して取得する。
|
static <T> T |
findById(java.lang.Class<T> entityClass,
java.lang.Object... id)
主キーを指定して、1件だけエンティティを取得する。
|
static <T> T |
findBySqlFile(java.lang.Class<T> entityClass,
java.lang.String sqlId,
java.lang.Object params)
SQL_IDをもとにバインド変数を展開して検索し、結果を格納したBeanを一件取得する。
|
static <T> void |
insert(T entity)
与えられたエンティティオブジェクトからインサート文を生成し実行する。
エンティティオブジェクトにてnullであるプロパティに対応するカラムは、そのままnullで登録される。
GeneratedValue が付与されているプロパティは採番された値が登録される。
Version が付与されたversionカラムに対して明示的に値を設定していたとしても、
「0」で上書きされてinsertされる。 |
static DaoContext |
page(long page)
ページ数を指定する。
|
static DaoContext |
per(long per)
1ページにつき何件取得するかを指定する。
|
static <T> int |
update(T entity)
与えられたエンティティオブジェクトからアップデート文を生成し実行する。
エンティティオブジェクトにてnullであるプロパティに対応するカラムは、そのままnullで更新される。
更新対象のエンティティに
Version が付与されたプロパティが存在する場合には、
対象レコードは排他制御の対象となり、更新処理実行時に自動で排他制御が実行される。
排他制御の対象であるエンティティを更新する際は、以下の場合にOptimisticLockException を送出する。
バージョン番号の不一致で、更新対象が存在しない場合
更新条件に合致する更新対象が存在しない場合
|
public static <T> T findById(java.lang.Class<T> entityClass, java.lang.Object... id)
T
- エンティティクラス(戻り値の型)entityClass
- エンティティクラスオブジェクトid
- 条件項目(複数のキーを使う場合は、対象テーブルでのキーの定義順に引き渡す)NoDataException
- 検索条件に該当するレコードが存在しない場合java.lang.IllegalStateException
- 対象テーブルから主キーの定義順を取得できなかった場合public static <T> EntityList<T> findAll(java.lang.Class<T> entityClass)
T
- エンティティクラス(戻り値の型)entityClass
- エンティティクラスオブジェクトpublic static <T> EntityList<T> findAllBySqlFile(java.lang.Class<T> entityClass, java.lang.String sqlId, java.lang.Object params)
// 検索条件を引き渡すためのBeanを設定する
// SQL「FIND_BY_AUTHOR」にBookエンティティのAUTHORカラムがバインド変数として記述されている場合を想定する
Book condition = new Book();
condition.setAuthor("Martin Fowler");
EntityList<Book> books = UniversalDao.findAllBySqlFile(Book.class, "FIND_BY_AUTHOR", condition);
結合した表のカラムを含めて射影する場合は、単一の表とマッピングされたEntityでは結果を格納できない。
そのような場合は、射影したカラムと対応するプロパティを定義したBeanを引き渡す。T
- 検索結果をマッピングするBeanクラスentityClass
- 検索結果をマッピングするBeanクラスオブジェクトsqlId
- SQL_IDparams
- バインド変数(SQLファイル内のバインド変数に対応するBeanを作成し引き渡すこともできる)public static <T> EntityList<T> findAllBySqlFile(java.lang.Class<T> entityClass, java.lang.String sqlId)
findAllBySqlFile(Class, String, Object)
を参照すること。T
- 検索結果をマッピングするBeanクラスentityClass
- 検索結果をマッピングするBeanクラスオブジェクトsqlId
- SQL_IDpublic static <T> T findBySqlFile(java.lang.Class<T> entityClass, java.lang.String sqlId, java.lang.Object params)
// 検索条件を引き渡すためのBeanを設定する
// FIND_BY_IDにBookエンティティのIDカラムがバインド変数として記述されている場合を想定
Book condition = new Book();
condition.setId(1L);
Book book = UniversalDao.findBySqlFile(Book.class, "FIND_BY_ID", condition);
検索条件に該当するレコードが複数存在する場合、例外の送出は行わず、検索結果の先頭行を取得して返却する。
確実に一行のレコードを取得する検索条件を設定すること。
T
- 検索結果をマッピングするBeanクラスentityClass
- 検索結果をマッピングするBeanクラスオブジェクトsqlId
- SQL_IDparams
- バインド変数NoDataException
- (検索条件に該当するレコードが存在しない場合)public static <T> long countBySqlFile(java.lang.Class<T> entityClass, java.lang.String sqlId)
countBySqlFile(Class, String, Object)
を参照すること。T
- エンティティクラスentityClass
- エンティティクラスsqlId
- SQL_IDpublic static <T> long countBySqlFile(java.lang.Class<T> entityClass, java.lang.String sqlId, java.lang.Object params)
T
- エンティティクラスentityClass
- エンティティクラスsqlId
- SQL_IDparams
- バインド変数public static <T> boolean exists(java.lang.Class<T> entityClass, java.lang.String sqlId)
exists(Class, String, Object)
を参照すること。
T
- エンティティ型entityClass
- エンティティクラスsqlId
- SQL_IDpublic static <T> boolean exists(java.lang.Class<T> entityClass, java.lang.String sqlId, java.lang.Object params)
T
- エンティティ型entityClass
- エンティティクラスsqlId
- SQL_IDparams
- バインド変数public static <T> int update(T entity)
Version
が付与されたプロパティが存在する場合には、
対象レコードは排他制御の対象となり、更新処理実行時に自動で排他制御が実行される。
排他制御の対象であるエンティティを更新する際は、以下の場合にOptimisticLockException
を送出する。
T
- エンティティクラスentity
- エンティティオブジェクトjavax.persistence.OptimisticLockException
- 更新対象が存在しない場合public static <T> void batchUpdate(java.util.List<T> entities)
update(Object)
を使用すること。
もし、更新時にバージョン番号が不一致のエンティティオブジェクトが存在した場合、
そのレコードは更新されずに処理が正常に終了する。T
- エンティティクラスentities
- エンティティオブジェクトリストpublic static <T> void insert(T entity)
GeneratedValue
が付与されているプロパティは採番された値が登録される。
Version
が付与されたversionカラムに対して明示的に値を設定していたとしても、
「0」で上書きされてinsertされる。T
- エンティティクラスentity
- エンティティオブジェクトpublic static <T> void batchInsert(java.util.List<T> entities)
GeneratedValue
が付与されているプロパティは採番された値が登録される。
Version
が付与されたversionカラムに対して明示的に値を設定していたとしても、
「0」で上書きされてinsertされる。T
- エンティティクラスentities
- エンティティリストpublic static <T> int delete(T entity)
T
- エンティティクラスentity
- エンティティオブジェクトpublic static <T> void batchDelete(java.util.List<T> entities)
T
- エンティティクラスentities
- エンティティリストpublic static DaoContext page(long page)
// pageメソッドに「1」が与えられている場合に返却される件数は以下のようになる。
// perメソッドに「10」を与える→1~10件目を返す
// perメソッドに「20」を与える→1~20件目を返す
EntityList<Book> books = UniversalDao.page(1)
.per(20)
.findAllBySqlFile(Book.class, "FIND_ALL");
// pageメソッドに「2」が与えられている場合に返却される件数は以下のようになる。
// perメソッドに「10」を与える→11~20件目を返す
// perメソッドに「20」を与える→21~40件目を返す
EntityList<Book> books = UniversalDao.page(2)
.per(20)
.findAllBySqlFile(Book.class, "FIND_ALL");
表示対象のページ数におけるレコード件数が、perメソッドで与えたページ区切りに満たない場合は、取得可能な件数分を返却する。
page
- ページ数public static DaoContext per(long per)
// perメソッドに「10」が与えられている場合は、返却される件数は以下のようになる。
// pageメソッドに「1」を与える→1~10件目を返す
// pageメソッドに「2」を与える→11~20件目を返す
EntityList<Book> books = UniversalDao.page(1)
.per(10)
.findAllBySqlFile(Book.class, "FIND_ALL");
// perメソッドに「20」が与えられている場合は、返却される件数は以下のようになる。
// pageメソッドに「1」を与える→1~20件目を返す
// pageメソッドに「2」を与える→21~40件目を返す
EntityList<Book> books = UniversalDao.page(1)
.per(20)
.findAllBySqlFile(Book.class, "FIND_ALL");
表示対象のページ数におけるレコード件数が、perメソッドで与えたページ区切りに満たない場合は、取得可能な件数分を返却する。
perメソッドに10を与えていて、総件数が5件である場合、pageメソッドに1を与えた場合は1~5件目を返却する。
perメソッドに10を与えていて、総件数が15件である場合、pageメソッドに2を与えた場合は11~15件目を返却する。
per
- 取得する件数public static DaoContext defer()
// サーバサイドカーソルを利用するためclose処理を行う必要がある
try (DeferredEntityList<Project> searchList = (DeferredEntityList<Project>) UniversalDao
.defer()
.findAllBySqlFile(Project.class, "SEARCH_PROJECT",searchCondition)) {
for (Project project : searchList) {
// projectを利用した処理
}
}