Select

To execute a search using the SELECT statement, annotate the DAO method with @Select.

@Dao
public interface EmployeeDao {
    @Select
    List<Employee> selectByDepartmentName(String departmentName);
    ...
}

The @Select annotation requires an SQL template. Describe the SQL template in an SQL file or in the @Sql annotation.

注釈

検索結果に応じて エンティティクラスを作成する必要があります。たとえば、EMPLOYEE テーブルに対応する Employee クラスが宣言されている場合、EMPLOYEE テーブルの列を含む結果セットは Employee クラスとして受け入れられます。ただし、EMPLOYEEテーブルとDEPARTMENTテーブルを結合して得られる結果セットには、Employeeエンティティクラスとは別のクラス (例えばEmployeeDepartmentクラス) が必要です。

検索条件

検索条件にはメソッドのパラメータを使用します。使用可能な型は以下の通りです。

パラメータ数に制限はありません。パラメータの型が 基本クラス または ドメインクラス の場合、パラメータに null を設定できます。型がそれ以外の場合、パラメータは null であってはなりません。

基本クラスまたはドメインクラスを使用したクエリ

メソッドのパラメータとして 基本クラス または ドメインクラス を宣言します。

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

バインド変数ディレクティブを使用してメソッドのパラメータを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.getSalary() */100

複数のパラメータを指定できます。

@Select
List<Employee> selectByEmployeeAndDepartment(Employee employee, Department department);

Iterable を使用した IN 句へのマッピング

IN句へバインドするには、 java.lang.Iterable のサブタイプを使用します。

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

検索結果の保証

検索結果が1件以上存在することを保証したい場合は、 @SelectensureResult 要素に true を指定します。

@Select(ensureResult = true)
Employee selectById(Integer id);

検索結果が0件ならば NoResultException がスローされます。

検索結果のマッピングの保証

エンティティのプロパティすべてに対して漏れなく結果セットのカラムをマッピングすることを保証したい場合は、 @SelectensureResultMapping 要素に true を指定します。

@Select(ensureResultMapping = true)
Employee selectById(Integer id);

結果セットのカラムにマッピングされていないプロパティがある場合、 ResultMappingException がスローされます。

クエリタイムアウト

@Select アノテーション内の queryTimeout プロパティにクエリタイムアウトの秒数を指定できます。

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

queryTimeout プロパティの値が設定されていない場合は、 設定 で指定されたクエリタイムアウトが使用されます。

フェッチサイズ

フェッチサイズは @Select アノテーション内の fetchSize プロパティに指定できます。

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

値が設定されていない場合は、 設定 で指定されたフェッチ サイズが使用されます。

最大行数

最大行数は @Select アノテーション内の maxRows プロパティに指定できます。

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

値が設定されていない場合は、設定 で指定された最大行数が使用されます。

マップのキーの命名規則

検索結果を java.util.Map<String, Object> にマッピングする場合、 @SelectmapKeyNaming 要素にマップのキーの命名規約を指定できます。

@Select(mapKeyNaming = MapKeyNamingType.CAMEL_CASE)
List<Map<String, Object>> selectAll();

MapKeyNamingType.CAMEL_CASE は、カラム名をキャメルケースに変換することを示します。 そのほかにカラム名を大文字や小文字に変換する規約があります。

最終的な変換結果は、ここに指定した値と 設定 に指定された MapKeyNaming の実装により決まります。

SQLログの出力形式

@SelectsqlLog 要素に SQL のログ出力形式を指定できます。

@Select(sqlLog = SqlLogType.RAW)
List<Employee> selectById(Integer id);

SqlLogType.RAW はバインドパラメータ付きの SQL をログ出力することを表します。