問い合わせメソッド
DAO (Data Access Object) インタフェースには様々な問い合わせメソッドを持たせることができます.
- 全件取得
- 主キーによる検索
- 主キーによる検索 (リファレンスのみ)
- 主キーとバージョンによる検索
- 引数を条件とする検索
- エンティティのプロパティを条件とする検索
- DTOのプロパティを条件とする検索
- 条件式による検索
- JPQLによる検索
- SQLによる検索
- 特別な意味を持つ引数名およびDTOのプロパティ名
- 関連を表す引数名およびDTOのプロパティ名
- 引数名およびDTOのプロパティ名のサフィックス
全件取得
エンティティを全件取得するメソッドです.
- メソッド名 (正規表現)
(get|find)All
- 引数
- なし
- 戻り値
- エンティティの
List
- 例
public interface EmployeeDao { List<Employee> findAll(); }
- 実行されるJPQL
SELECT employee FROM Employee AS employee
主キーによる検索
主キーを指定してエンティティを取得するメソッドです.
検索はEntityManager#find(Class, Object)
メソッドによって行われます.
引数で指定された主キーに該当するエンティティが存在しない場合はnull
が返されます.
- メソッド名 (正規表現)
get|find
- 引数
- エンティティの主キー
- 戻り値
- エンティティ
- 例
public interface EmployeeDao { Employee find(int id); }
主キーによる検索 (リファレンスのみ)
主キーを指定してエンティティを取得するメソッドです. 返されるエンティティの状態は遅延ロードされます. エンティティの状態に最初にアクセスしたときに遅延ロードが発生します.
検索はEntityManager#getReference(Class, Object)
メソッドによって行われます.
引数で指定された主キーに該当するエンティティが存在しない場合でもエンティティが返されますが,
このエンティティの状態にアクセスしたときにjavax.persistence.ObjectNotFoundException
がスローされます.
- メソッド名 (正規表現)
(get|find)Reference
- 引数
- エンティティの主キー
- 戻り値
- エンティティ
- 例
public interface EmployeeDao { Employee getReference(int id); }
主キーとバージョンによる検索
主キーとバージョンを指定してエンティティを取得するメソッドです.
引数で指定された主キーに該当するエンティティが存在しない場合はnull
が返されます.
引数で指定されたバージョンとエンティティのバージョンが一致しない場合は
javax.persistence.OptimisticLockException
がスローされます.
- メソッド名 (正規表現)
get|find
- 引数
- エンティティの主キー, エンティティのバージョンプロパティ
- 戻り値
- エンティティ
- 例
public interface EmployeeDao { Employee find(int id, int version); }
- 実行されるJPQL
SELECT employee FROM Employee AS employee WHERE employee.id = :id
引数を条件とする検索
引数にマッチするエンティティを取得するメソッドです.
引数は問い合わせ条件に含めるエンティティのプロパティと引数の名前を一致させます.
メソッドが呼び出された際に,null
でない引数が問い合わせ条件に含まれます.
null
でない引数が複数ある場合はAND
で連結されます.
引数名には演算子をサフィックスで指定することができます.
指定可能なサフィックスは「引数名およびDTOのプロパティ名のサフィックス」
を
参照してください.
サフィックスを省略すると =
演算子が使用されます.
- メソッド名 (正規表現)
(get|find).*
- 引数
- 問い合わせ条件に含めるエンティティのプロパティの並び
- 戻り値
- エンティティまたはエンティティの
List
- 例
public interface EmployeeDao { List<Employee> findByParameter(String name); }
- 実行されるJPQL
SELECT employee FROM Employee AS employee WHERE employee.name = :name
エンティティのプロパティを条件とする検索
引数で指定したエンティティのプロパティにマッチするエンティティを取得するメソッドです.
メソッドが呼び出された際に,引数で渡されたエンティティのnull
でないプロパティが
問い合わせ条件に含まれます.
null
でないプロパティが複数ある場合はAND
で連結されます.
- メソッド名 (正規表現)
(get|find).*
- 引数
- 問い合わせ条件に含めるエンティティ
- 戻り値
- エンティティまたはエンティティの
List
- 例
public interface EmployeeDao { List<Employee> findByExample(Employee emp); }
- 実行されるJPQL
SELECT employee FROM Employee AS employee WHERE employee.name = :name AND employee.hereDate = :hereDate
DTOのプロパティを条件とする検索
引数で指定したDTOのプロパティにマッチするエンティティを取得するメソッドです.
メソッドが呼び出された際に,引数で渡されたDTOのnull
でないプロパティが
問い合わせ条件に含まれます.
null
でないプロパティが複数ある場合はAND
で連結されます.
DTOのプロパティ名には演算子をサフィックスで指定することができます.
指定可能なサフィックスは「引数名およびDTOのプロパティ名のサフィックス」
を
参照してください.
サフィックスを省略すると =
演算子が使用されます.
- メソッド名 (正規表現)
(get|find).*
- 引数
- 問い合わせ条件に含めるDTO
- 戻り値
- エンティティまたはエンティティの
List
- 例
public interface EmployeeDao { List<Employee> findByDto(EmployeeDto dto); }
- 実行されるJPQL
SELECT employee FROM Employee AS employee WHERE employee.name LIKE :name
条件式による検索
引数で指定した条件式にマッチするエンティティを取得するメソッドです.
条件式はKuina-DaoのCriteria APIが提供するもので,ORや副問い合わせなどJPQLのWHERE句で
可能な任意の条件を指定することができます.
- メソッド名 (正規表現)
(get|find).*
- 引数
- 条件式の並び
- 戻り値
- エンティティまたはエンティティの
List
- 例
public interface EmployeeDao { List<Employee> findCondition(ConditionalExpession cond); }
JPQLによる検索
Named Queryを使用して問い合わせを行うメソッドです.
使用するNamed Queryの名前はDaoのインタフェース名または問い合わせ対象のエンティティ名と,メソッド名をピリオドで
連結したものになります.
メソッドに@QueryName
を付けることにより,使用するNamed Queryの名前を
明示的に指定することもできます.
検索順は次のとおりです.
- (もしあれば)
@QueryName
アノテーションで指定された名前 - <DaoのFQN>.<Daoのメソッド名>
- <Daoの単純名>.<Daoのメソッド名>
- <エンティティ名>.<Daoのメソッド名>
JPQLは@NamedQueryアノテーションまたはマッピングファイルで定義します.
- メソッド名 (正規表現)
(get|find).*
- 引数
- JPQLに含まれるパラメータの並び
- 戻り値
- エンティティまたはエンティティの
List
- 例
public interface EmployeeDao { List<Employee> findByName(); }
- 実行されるNamed Queryの例
<named-query name="Employee.findByName"> <query> SELECT employee FROM Employee employee WHERE employee.name = :name </query> </named-query>
SQLによる検索
S2Dao相当の2WAY-SQLファイルを使用して問い合わせを行うメソッドです.
問い合わせの結果は任意のDTOまたはMap
にマップすることができます.
DTOにマップする場合は,問い合わせ結果のカラム名と名前の一致するDTOのプロパティに値が設定されます.
使用するSQLファイルの名前は,Daoのインタフェース名とメソッド名をアンダースコアで連結し,
拡張子 .sql
を付加したものになります.
SQLファイルはDaoインタフェースのパッケージと同じ階層のディレクトリに配置します.
SQLによる検索は,JPA (EntityManager
) を使用せず,JDBC APIを直接使用します.
- メソッド名 (正規表現)
(get|find).*
- 引数
- SQLに含まれるパラメータの並び
- 戻り値
- DTOまたはDTOの
List
またはMap
またはMap
のList
- 例
public interface EmployeeDao { List<EmployeeDto> findByDepartmentName(String departmentName); }
- DTO
public class EmployeeDto { private int eid; private String ename; private String dname; //setters and getters }
- 実行されるSQLファイルの名前の例
EmployeeDao_findByDepartmentName.sql
- 実行されるSQLファイルの例
SELECT e.id eid, e.name ename, d.name dname FROM Employee e INNER JOIN Department d ON (e.department_id = d.id) WHERE d.name = /*departmentName*/'foo'
特別な意味を持つ引数名およびDTOのプロパティ名
引数を条件とする検索およびDTOのプロパティを条件とする検索では,特別な意味を持つ引数名またはプロパティ名があります.
引数名/DTOのプロパティ名 | 型 | 説明 |
---|---|---|
orderby およびorderBy |
String またはString[] または
OrderbySpec またはOrderbySpec[] |
ソート順を指定します. |
firstResult |
int またはInteger |
問い合わせで取得する最初の位置を指定します. 位置は0から始まります. |
maxResults |
int またはInteger |
問い合わせで取得する最大の件数を指定します. |
これらの引数名またはプロパティ名を通常の引数またはプロパティとして問い合わせ条件に含める場合は,
引数またはプロパティのgetterメソッドに@NamedParameter
アノテーションを指定します.
関連を表す引数名およびDTOのプロパティ名
引数を条件とする検索およびDTOのプロパティを条件とする検索では,引数名またはDTOのプロパティ名で関連を表現することができます.
引数名またはDTOのプロパティ名で関連を表現するには,関連プロパティ名の後ろに'$'
を付加し,
関連先エンティティのプロパティ名を続けます.
department$name
上の例では,検索対象のエンティティが持つ関連department
のプロパティname
を
問い合わせ条件として使用します.
関連先エンティティの関連先を連続してしていることもできます.
department$manager$name
上の例では,検索対象のエンティティが持つ関連department
の先にあるエンティティが持つ関連
manager
のプロパティname
を問い合わせ条件として使用します.
引数名およびDTOのプロパティ名のサフィックス
引数を条件とする検索およびDTOのプロパティを条件とする検索では,問い合わせ条件に使用する演算子を
引数名またはプロパティ名のサフィックスで指定することができます.
サフィックスが指定されていない場合は =
演算子が適用されます.
サフィックス | 演算子 | 説明 |
---|---|---|
_EQ |
= |
|
_NE |
<> |
|
_LT |
< |
|
_LE |
<= |
|
_GT |
> |
|
_GE |
>= |
|
_IN |
IN |
引数またはプロパティの型は配列にします. |
_NOT_IN |
NOT IN |
引数またはプロパティの型は配列にします. |
_LIKE |
LIKE |
|
_STARTS |
LIKE |
引数またはプロパティの値 (文字列) の末尾に'%'が付加されます. |
_ENDS |
LIKE |
引数またはプロパティの値 (文字列) の先頭に'%'が付加されます. |
_CONTAINS |
LIKE |
引数またはプロパティの値 (文字列) の先頭と末尾に'%'が付加されます. |
_IS_NULL |
IS NULL |
引数またはプロパティの値はboolean またはBoolean としてください.
値が真の場合,問い合わせ条件に含まれます.
|
_IS_NOT_NULL |
IS NOT NULL |
引数またはプロパティの値はboolean またはBoolean としてください.
値が真の場合,問い合わせ条件に含まれます.
|