Class UniversalDao

java.lang.Object
nablarch.common.dao.UniversalDao

@Published public final class UniversalDao extends Object
汎用的なDAO機能を提供するクラス。

以下の機能を提供する。

  • 主キーを条件にしたSELECT・UPDATE・DELETE文と、INSERT文をEntityクラスから自動生成して実行する。
  • SQLを実行する
  • 検索結果をBeanにマッピングする
  • ページングのための検索を行う
  • 検索時に遅延ロードを行う

EntityはJakarta Persistence 3.1のアノテーションに準拠する。

サポートしているものは、以下である。

  • Entity
  • Table
  • Column
  • Id
  • Version
  • Temporal
  • GeneratedValue
  • SequenceGenerator
  • TableGenerator

  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    トランザクション境界を作るためのクラス。
  • Method Summary

    Modifier and Type
    Method
    Description
    static <T> void
    batchDelete(List<T> entities)
    与えられたエンティティオブジェクトからデリート文を生成し一括実行する。
    static <T> void
    batchInsert(List<T> entities)
    与えられたエンティティリストオブジェクトからインサート文を生成し一括実行する。
    static <T> void
    batchUpdate(List<T> entities)
    与えられたエンティティ情報からアップデート文を生成し一括実行する。
    static <T> long
    countBySqlFile(Class<T> entityClass, String sqlId)
    SQL_IDをもとに検索し、件数を取得する。
    static <T> long
    countBySqlFile(Class<T> entityClass, String sqlId, Object params)
    SQL_IDをもとにバインド変数を展開して検索し、件数を取得する。
    static DaoContext
    検索結果の取得を遅延させる。
    static <T> int
    delete(T entity)
    与えられたエンティティオブジェクトからデリート文を生成し実行する。
    static <T> boolean
    exists(Class<T> entityClass, String sqlId)
    SQL_IDをもとに検索し、データが存在するか否かを確認する。
    static <T> boolean
    exists(Class<T> entityClass, String sqlId, Object params)
    SQL_IDをもとにバインド変数を展開して検索し、データが存在するか否かを確認する。
    static <T> EntityList<T>
    findAll(Class<T> entityClass)
    すべてのエンティティを取得する。
    static <T> EntityList<T>
    findAllBySqlFile(Class<T> entityClass, String sqlId)
    SQL_IDをもとに検索し、結果Beanのリストに格納して取得する。
    static <T> EntityList<T>
    findAllBySqlFile(Class<T> entityClass, String sqlId, Object params)
    SQL_IDをもとにバインド変数を展開した上で検索し、結果Beanのリストに格納して取得する。
    static <T> T
    findById(Class<T> entityClass, Object... id)
    主キーを指定して、1件だけエンティティを取得する。
    static <T> T
    findByIdOrNull(Class<T> entityClass, Object... id)
    主キーを指定して、1件だけエンティティを取得する。0件の場合はnullを返す。
    static <T> T
    findBySqlFile(Class<T> entityClass, String sqlId, Object params)
    SQL_IDをもとにバインド変数を展開して検索し、結果を格納したBeanを一件取得する。
    static <T> T
    findBySqlFileOrNull(Class<T> entityClass, String sqlId, Object params)
    SQL_IDをもとにバインド変数を展開して検索し、結果を格納したBeanを一件取得する。0件の場合はnullを返す。
    static <T> void
    insert(T entity)
    与えられたエンティティオブジェクトからインサート文を生成し実行する。
    static DaoContext
    page(long page)
    ページ数を指定する。
    static DaoContext
    per(long per)
    1ページにつき何件取得するかを指定する。
    static <T> int
    update(T entity)
    与えられたエンティティオブジェクトからアップデート文を生成し実行する。

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • findById

      public static <T> T findById(Class<T> entityClass, Object... id)
      主キーを指定して、1件だけエンティティを取得する。
      Type Parameters:
      T - エンティティクラス(戻り値の型)
      Parameters:
      entityClass - エンティティクラスオブジェクト
      id - 条件項目(複数のキーを使う場合は、対象テーブルでのキーの定義順に引き渡す)
      Returns:
      取得したエンティティ
      Throws:
      NoDataException - 検索条件に該当するレコードが存在しない場合
      IllegalArgumentException - 主キーのカラム数と指定した条件数が一致しない場合
      IllegalStateException - 対象テーブルから主キーの定義順を取得できなかった場合
    • findByIdOrNull

      public static <T> T findByIdOrNull(Class<T> entityClass, Object... id)
      主キーを指定して、1件だけエンティティを取得する。0件の場合はnullを返す。
      Type Parameters:
      T - エンティティクラス(戻り値の型)
      Parameters:
      entityClass - エンティティクラスオブジェクト
      id - 条件項目(複数のキーを使う場合は、対象テーブルでのキーの定義順に引き渡す)
      Returns:
      取得したエンティティ。0件の場合はnull。
      Throws:
      IllegalArgumentException - 主キーのカラム数と指定した条件数が一致しない場合
      IllegalStateException - 対象テーブルから主キーの定義順を取得できなかった場合
    • findAll

      public static <T> EntityList<T> findAll(Class<T> entityClass)
      すべてのエンティティを取得する。
      Type Parameters:
      T - エンティティクラス(戻り値の型)
      Parameters:
      entityClass - エンティティクラスオブジェクト
      Returns:
      取得したエンティティのリスト(該当0件の場合は空リスト)
    • findAllBySqlFile

      public static <T> EntityList<T> findAllBySqlFile(Class<T> entityClass, String sqlId, Object params)
      SQL_IDをもとにバインド変数を展開した上で検索し、結果Beanのリストに格納して取得する。
       
       // 検索条件を引き渡すための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を引き渡す。

      Type Parameters:
      T - 検索結果をマッピングするBeanクラス
      Parameters:
      entityClass - 検索結果をマッピングするBeanクラスオブジェクト
      sqlId - SQL_ID
      params - バインド変数(SQLファイル内のバインド変数に対応するBeanを作成し引き渡すこともできる)
      Returns:
      取得したBeanのリスト(該当0件の場合は空リスト)
    • findAllBySqlFile

      public static <T> EntityList<T> findAllBySqlFile(Class<T> entityClass, String sqlId)
      SQL_IDをもとに検索し、結果Beanのリストに格納して取得する。

      検索の詳細はfindAllBySqlFile(Class, String, Object)を参照すること。

      Type Parameters:
      T - 検索結果をマッピングするBeanクラス
      Parameters:
      entityClass - 検索結果をマッピングするBeanクラスオブジェクト
      sqlId - SQL_ID
      Returns:
      取得したBeanのリスト(該当0件の場合は空リスト)
    • findBySqlFile

      public static <T> T findBySqlFile(Class<T> entityClass, String sqlId, Object params)
      SQL_IDをもとにバインド変数を展開して検索し、結果を格納したBeanを一件取得する。
       
       // 検索条件を引き渡すためのBeanを設定する
       // FIND_BY_IDにBookエンティティのIDカラムがバインド変数として記述されている場合を想定
       Book condition = new Book();
       condition.setId(1L);
      
       Book book = UniversalDao.findBySqlFile(Book.class, "FIND_BY_ID", condition);
       

      検索条件に該当するレコードが複数存在する場合、例外の送出は行わず、検索結果の先頭行を取得して返却する。 確実に一行のレコードを取得する検索条件を設定すること。

      Type Parameters:
      T - 検索結果をマッピングするBeanクラス
      Parameters:
      entityClass - 検索結果をマッピングするBeanクラスオブジェクト
      sqlId - SQL_ID
      params - バインド変数
      Returns:
      1件のBean
      Throws:
      NoDataException - (検索条件に該当するレコードが存在しない場合)
    • findBySqlFileOrNull

      public static <T> T findBySqlFileOrNull(Class<T> entityClass, String sqlId, Object params)
      SQL_IDをもとにバインド変数を展開して検索し、結果を格納したBeanを一件取得する。0件の場合はnullを返す。

      検索結果が0件の場合にNoDataExceptionではなくnull返す以外については、findBySqlFile(Class, String, Object) と同じである。

      Type Parameters:
      T - 検索結果をマッピングするBeanクラス
      Parameters:
      entityClass - 検索結果をマッピングするBeanクラスオブジェクト
      sqlId - SQL_ID
      params - バインド変数
      Returns:
      1件のBean。0件の場合はnull。
    • countBySqlFile

      public static <T> long countBySqlFile(Class<T> entityClass, String sqlId)
      SQL_IDをもとに検索し、件数を取得する。

      検索の詳細はcountBySqlFile(Class, String, Object)を参照すること。

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entityClass - エンティティクラス
      sqlId - SQL_ID
      Returns:
      件数
    • countBySqlFile

      public static <T> long countBySqlFile(Class<T> entityClass, String sqlId, Object params)
      SQL_IDをもとにバインド変数を展開して検索し、件数を取得する。

      検索用のSQLを件数取得用のSQLへと変換して実行されるため、個別に件数取得用のSQLを作成する必要はない。

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entityClass - エンティティクラス
      sqlId - SQL_ID
      params - バインド変数
      Returns:
      件数
    • exists

      public static <T> boolean exists(Class<T> entityClass, String sqlId)
      SQL_IDをもとに検索し、データが存在するか否かを確認する。

      検索の詳細はexists(Class, String, Object)を参照すること。

      Type Parameters:
      T - エンティティ型
      Parameters:
      entityClass - エンティティクラス
      sqlId - SQL_ID
      Returns:
      存在すればtrue
    • exists

      public static <T> boolean exists(Class<T> entityClass, String sqlId, Object params)
      SQL_IDをもとにバインド変数を展開して検索し、データが存在するか否かを確認する。

      検索用のSQLを変換して使用する。

      Type Parameters:
      T - エンティティ型
      Parameters:
      entityClass - エンティティクラス
      sqlId - SQL_ID
      params - バインド変数
      Returns:
      存在すればtrue
    • update

      public static <T> int update(T entity)
      与えられたエンティティオブジェクトからアップデート文を生成し実行する。

      エンティティオブジェクトにてnullであるプロパティに対応するカラムは、そのままnullで更新される。

      更新対象のエンティティにVersionが付与されたプロパティが存在する場合には、 対象レコードは排他制御の対象となり、更新処理実行時に自動で排他制御が実行される。

      排他制御の対象であるエンティティを更新する際は、以下の場合にOptimisticLockExceptionを送出する。

      • バージョン番号の不一致で、更新対象が存在しない場合
      • 更新条件に合致する更新対象が存在しない場合

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entity - エンティティオブジェクト
      Returns:
      更新件数
      Throws:
      jakarta.persistence.OptimisticLockException - 更新対象が存在しない場合
    • batchUpdate

      public static <T> void batchUpdate(List<T> entities)
      与えられたエンティティ情報からアップデート文を生成し一括実行する。

      バージョン番号を用いた排他制御処理は行わない。 排他制御を必要とする場合には、update(Object)を使用すること。 もし、更新時にバージョン番号が不一致のエンティティオブジェクトが存在した場合、 そのレコードは更新されずに処理が正常に終了する。

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entities - エンティティオブジェクトリスト
    • insert

      public static <T> void insert(T entity)
      与えられたエンティティオブジェクトからインサート文を生成し実行する。

      エンティティオブジェクトにてnullであるプロパティに対応するカラムは、そのままnullで登録される。

      GeneratedValueが付与されているプロパティは採番された値が登録される。

      Versionが付与されたversionカラムに対して明示的に値を設定していたとしても、 「0」で上書きされてinsertされる。

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entity - エンティティオブジェクト
    • batchInsert

      public static <T> void batchInsert(List<T> entities)
      与えられたエンティティリストオブジェクトからインサート文を生成し一括実行する。

      エンティティオブジェクトにてnullであるプロパティに対応するカラムは、そのままnullで登録される。

      GeneratedValueが付与されているプロパティは採番された値が登録される。

      Versionが付与されたversionカラムに対して明示的に値を設定していたとしても、 「0」で上書きされてinsertされる。

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entities - エンティティリスト
    • delete

      public static <T> int delete(T entity)
      与えられたエンティティオブジェクトからデリート文を生成し実行する。

      エンティティの主キーが削除条件となるため、主キー値以外のフィールドの値の有無は動作に影響しない。

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entity - エンティティオブジェクト
      Returns:
      削除件数
    • batchDelete

      public static <T> void batchDelete(List<T> entities)
      与えられたエンティティオブジェクトからデリート文を生成し一括実行する。

      エンティティの主キーが削除条件となるため、主キー値以外のフィールドの値の有無は動作に影響しない。

      Type Parameters:
      T - エンティティクラス
      Parameters:
      entities - エンティティリスト
    • page

      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メソッドで与えたページ区切りに満たない場合は、取得可能な件数分を返却する。

      • perメソッドに10を与えていて、総件数が5件である場合、pageメソッドに1を与えた場合は1~5件目を返却する。
      • perメソッドに10を与えていて、総件数が15件である場合、pageメソッドに2を与えた場合は11~15件目を返却する。

      ページ変更の度に検索処理を行うことになるため、ソートを使用して検索結果の出力順を固定すること。

      Parameters:
      page - ページ数
      Returns:
      DaoContext
    • per

      public static DaoContext per(long per)
      1ページにつき何件取得するかを指定する。
       
        // 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件目を返却する。

      Parameters:
      per - 取得する件数
      Returns:
      DaoContext
    • defer

      public static DaoContext defer()
      検索結果の取得を遅延させる。

      大量データを検索する場合でもヒープを圧迫することなく安全に検索結果を扱うことができる。

       
       // サーバサイドカーソルを利用するためclose処理を行う必要がある
       try (DeferredEntityList<Project> searchList =  (DeferredEntityList<Project>) UniversalDao
               .defer()
               .findAllBySqlFile(Project.class, "SEARCH_PROJECT",searchCondition)) {
           for (Project project : searchList) {
               // projectを利用した処理
           }
       }
       

      Returns:
      DaoContext