About

ドキュメント

プロジェクト文書

Built by Maven

概要

検索を行うには、 @SelectをDaoのメソッドに注釈します。

@Config(config = AppConfig.class)
public interface EmployeeDao {
    @Select
    List<Employee> selectByDepartmentName(String departmentName);
    ...
}

検索では、SQLファイルが必須です。 検索系のSQLを自動生成する機能はありません。

問い合わせ条件

問い合わせ条件にはメソッドのパラメータを使用します。 パラメータの型には、基本型ドメインクラスエンティティティクラス および基本型ドメインクラスを要素とするjava.util.Listが使用できます。 パラメータの数に制限はありません。

@Select
List<Employee> selectByNameAndSalary(String name, BigDecimal salary);

SQLファイルではSQLコメントを使いメソッドのパラメータをSQLにマッピングさせます。 SQLコメントではメソッドのパラメータ名を参照します。

select * from employee where employee_name = /* name */'hoge' and salary > /* salary */100

メソッドのパラメータに基本型ではなくエンティティクラスを使用する場合は、ドット(.)でエンティティのプロパティにアクセスしSQLにマッピングさせます。

@Select
List<Employee> selectByExample(Employee employee);
select * from employee where employee_name = /* employee.name */'hoge' and salary > /* employee.salary */100

基本型ドメインクラスを要素とするjava.util.Listは、 IN句を利用した検索を行う場合に使用します。

@Select
List<Employee> selectByNames(List<String> names);
select * from employee where employee_name in /* names */('aaa','bbb','ccc')

複数件検索

複数件を検索するには、メソッドの戻り値の型をjava.util.Listにします。 Listの要素の型には、基本型ドメインクラスエンティティティクラスが使用できます。

@Select
List<Employee> selectByNameAndSalary(String name, BigDecimal salary);

結果が0件のときは、空のListが返されます。nullは返されません。

1件検索

複数件を検索するには、メソッドの戻り値の型を基本型ドメインクラスエンティティティクラスのいずれかにします。

@Select
Employee selectByNameAndSalary(String name, BigDecimal salary);

結果が0件のときは、nullが返されます。

結果が2件以上存在するときは、org.seasar.doma.jdbc.NonUniqueResultExceptionがスローされます。

イテレーションによる検索

全件を一度にListで受け取るのではなく1件ずつ処理を行いたい場合は、 イテレーションによる検索ができます。 イテレーションによる検索を行うには、@Selectiterate要素をtrueに設定し、 メソッドのパラメータにorg.seasar.doma.IterationCallback<R, T>もしくは、 org.seasar.doma.IterationCallback<R, T>のサブタイプを定義します。

@Select(iterate = true)
Void selectByNameAndSalary(String name, BigDecimal salary, IterationCallback<Void, Employee> callback);

IterationCallbackiterateメソッドに検索対象がインスタンス化され1件ずつ渡されます。

EmployeeDao dao = new EmployeeDao();
dao.selectAll(new IterationCallback<Void, Employee>() {
        @Override
        public Void iterate(Employee target, IterationContext context) {
            ...
            return null;
        }
    });

org.seasar.doma.IterationCallback<R, T>の最初の型パラメータは、 Daoのメソッドの戻り値にあわせなければいけません。2番目の型パラメータは、基本型ドメインクラスエンティティティクラスのいずれかでなければいけません。

検索オプションを利用した検索

検索オプションのクラスSelectOptionsを使用することで、SELECT文が記述されたSQLファイルをベースにし、 ページング処理や悲観的排他制御用のSQLを自動で生成できます。

SelectOptionsは、複数件検索1件検索イテレーションによる検索と組み合わせて使用します。

SelectOptionsは、Daoのメソッドのパラメータとして定義します。

@Config(config = AppConfig.class)
public interface EmployeeDao {
    @Select
    List<Employee> selectByDepartmentName(String departmentName, SelectOptions options);
    ...
}

SelectOptionsは、SelectOptionsのstaticなgetメソッドにより取得できます。

SelectOptions options = SelectOptions.get();

ページング

SelectOptionsoffsetメソッドで開始位置、limitメソッドで取得件数を指定し、 SelectOptionsのインスタンスをDaoのメソッドに渡します。

SelectOptions options = SelectOptions.get().offset(5).limit(10);
EmployeeDao dao = new EmployeeDao();
List<Employee> list = dao.selectByDepartmentName("ACCOUNT", options);

悲観的排他制御

SelectOptionsforUpdateメソッドで悲観的排他制御を行うことを指示し、 SelectOptionsのインスタンスをDaoのメソッドに渡します。

SelectOptions options = SelectOptions.get().forUpdate();
EmployeeDao dao = new EmployeeDao();
List<Employee> list = dao.selectByDepartmentName("ACCOUNT", options);

SelectOptionsには、ロック対象のテーブルやカラムのエイリアスを指定できるforUpdateメソッドや、 ロックの取得を待機しないforUpdateNowaitが用意されています。 詳しくはJavadocコメントを参照ください。

集計

SelectOptionscountメソッドを呼び出すことで、集計件数を取得できるようになります。 通常、ページングのオプションと組み合わせて使用し、ページングで絞り込まない場合の全件数を取得する場合に使います。

SelectOptions options = SelectOptions.get().offset(5).limit(10).count();
EmployeeDao dao = new EmployeeDao();
List<Employee> list = dao.selectByDepartmentName("ACCOUNT", options);
long count = options.getCount();

集計件数は、Daoのメソッド呼出し後に、SelectOptionsgetCountメソッドを使って取得します。 メソッド呼び出しの前にcountメソッドを実行していない場合、getCountメソッドは-1を返します。

クエリタイムアウト

@SelectqueryTimeout要素にクエリタイムアウトの秒数を指定できます。

@Select(queryTimeout = 10)
List<Employee> selectAll();

queryTimeout要素に値を指定しない場合、 設定クラスに指定されたクエリタイムアウトが使用されます。

フェッチサイズ

@SelectfetchSize要素にフェッチサイズを指定できます。

@Select(fetchSize = 20)
List<Employee> selectAll();

fetchSize要素に値を指定しない場合、 設定クラスに指定されたフェッチサイズが使用されます。

最大行数

@SelectmaxRows要素に最大行数を指定できます。

@Select(maxRows = 100)
List<Employee> selectAll();

maxRows要素に値を指定しない場合、 設定クラスに指定された最大行数が使用されます。