概要
SQL自動生成による操作 の 検索条件 や 結合条件 では, SimpleWhereによる指定 や Mapによる指定 ができますが, これらはプロパティ名を文字列で扱うため, 実行するまで名前の間違いに気づきにくくなります. また, プロパティの型と異なる型をパラメータに指定した場合も実行するまで気づきにくくなります.
S2JDBC のタイプセーフ API を利用すると, プロパティの名前や型の間違いをコンパイル時にチェックできるようになります. タイプセーフ API は, S2JDBC-Gen の Gen-Names タスクで生成される Names クラス と, S2JDBC が提供する Operations クラス によって構成されます. S2JDBC-Gen の Gen-Service タスクによって生成される Service クラス クラスを使うと, タイプセーフ API を容易に利用することができます.
Names クラス
Names
クラスは,
S2JDBC-Gen
の
Gen-Names
タスクによって生成されるクラスで, エンティティのプロパティに対応した
static
メソッドが定義されます.
Names
クラスのメソッドを static import して使うと,
SimpleWhere
を使った次の例は,
jdbcManager.from(Employee.class) .innerJoin("department") .where(new SimpleWhere() .eq("name", name) .eq("department.name", deptName) .getResultList();
次のようになります.
jdbcManager.from(Employee.class) .innerJoin(department()) .where(new SimpleWhere() .eq(name(), name) .eq(department().name(), deptName)) .getResultList();
name()
や
department()
が static import された
Names
クラスのメソッドです.
メソッド名が間違っているとコンパイルでエラーとなるため,実行する前に間違いを見つけることができます.
また,IDE
で補完できるため,
入力も容易になります (
Eclipse で static import を使う場合の設定について
).
関連先のプロパティは
department().name()
のように指定します.
ネストは何段階でも無制限に指定可能です.
SimpleWhere
クラスを使った場合,プロパティの型とパラメータの値の整合性はチェックされません.
タイプセーフに使うには,
SimpleWhere
クラスではなく, 後述の
Operations クラス
を使用してください.
Operations クラス
Operations
クラスは S2JDBC が提供するクラスで,FQNは次のとおりです.
org.seasar.extension.jdbc.operation.Operations
Operations
クラスは
SimpleWhere
クラスと同じようなメソッドを
static
メソッドとして提供します.
Operations
クラスのメソッドを static import し,
Names
クラスと組み合わせて使用することで,
プロパティの型とパラメータの型が適合していることをコンパイル時にチェックすることができます (
Eclipse で static import を使う場合の設定について
).
SimpleWhere
クラスを使った次の例は,
jdbcManager.from(Employee.class) .where(new SimpleWhere() .eq("name", name) .gt("salary", salary)) .getResultList();
Operations
クラスのメソッドを static import して使うと次のようになります.
jdbcManager.from(Employee.class) .where( eq(name(), name), gt(salary(), salary)) .getResultList();
eq()
メソッドや
gt()
メソッドが
Operations
クラスのメソッドです.
eq()
メソッドなどは次のように定義されています.
public static <PropType, ParamType extends PropType>
SingleValueOperator eq(PropertyName<PropType> propertyName, ParamType param)
Names
クラスのメソッドは, プロパティの型を型引数とする
PropertyName
型を返すように定義されているため, プロパティの型にパラメータの型が代入可能でないとコンパイルでエラーとなります.
Operations
クラスには次のメソッドが定義されています.
メソッド | 説明 |
---|---|
eq(PropertyName<PropType> propertyName, ParamType param) |
propertyName = ?
の条件を追加します.
param が null の時は追加されません.
|
ne(PropertyName<PropType> propertyName, ParamType param) |
propertyName <> ?
の条件を追加します.
param が null の時は追加されません.
|
lt(PropertyName<PropType> propertyName, ParamType param) |
propertyName < ?
の条件を追加します.
param が null の時は追加されません.
|
le(PropertyName<PropType> propertyName, ParamType param) |
propertyName <= ?
の条件を追加します.
param が null の時は追加されません.
|
gt(PropertyName<PropType> propertyName, ParamType param) |
propertyName > ?
の条件を追加します.
param が null の時は追加されません.
|
ge(PropertyName<PropType> propertyName, ParamType param) |
propertyName >= ?
の条件を追加します.
param が null の時は追加されません.
|
in(PropertyName<PropType> propertyName, ParamType... params) |
propertyName in (?, ...)
の条件を追加します.
param の配列の長さが 0 の時は追加されません.
|
not in(PropertyName<PropType> propertyName, ParamType... params) |
propertyName not in (?, ...)
の条件を追加します.
param の配列の長さが 0 の時は追加されません.
|
like(PropertyName<String> propertyName, String param) |
propertyName like ?
の条件を追加します.
param が null の時は追加されません.
|
like(PropertyName<String> propertyName, String param, char escape) |
propertyName like ? escape ?
の条件を追加します.
param が null の時は追加されません.
|
starts(PropertyName<String> propertyName, String param) |
propertyName like ?
の条件を追加します.
param が null の時は追加されません.
param の末尾に自動的に
%
が追加されます.
param
に半角の
'%', '_'
や全角の
'%', '_'
が含まれる場合はエスケープされます.
|
ends(PropertyName<String> propertyName, String param) |
propertyName like ?
の条件を追加します.
param が null の時は追加されません.
param の先頭に自動的に
%
が追加されます.
param
に半角の
'%', '_'
や全角の
'%', '_'
が含まれる場合はエスケープされます.
|
contains(PropertyName<String> propertyName, String param) |
propertyName like ?
の条件を追加します.
param が null の時は追加されません.
param の先頭と末尾に自動的に
%
が追加されます.
param
に半角の
'%', '_'
や全角の
'%', '_'
が含まれる場合はエスケープされます.
|
isNull(PropertyName<?> propertyName) |
propertyName is null
の条件を追加します.
|
isNull(PropertyName<?> propertyName, Boolean param) |
propertyName is null
の条件を追加します.
param が null あるいは
Boolean.FALSE の時は追加されません。
|
isNotNull(PropertyName<?> propertyName) |
propertyName is not null
の条件を追加します.
|
isNotNull(PropertyName<?> propertyName, Boolan param) |
propertyName is not null
の条件を追加します.
param が null あるいは
Boolean.FALSE の時は追加されません。
|
and(Where... children) |
子供の検索条件を AND で結合した条件を追加します.
|
or(Where... children) |
子供の検索条件を OR で結合した条件を追加します.
|
ソート順 で利用するために,以下のメソッドも定義されています.
メソッド | 説明 |
---|---|
asc(CharSequence propertyName) |
昇順のソート順を返します. |
desc(CharSequence propertyName) |
降順のソート順を返します. |
これらのメソッドを使うと,次の例は,
jdbcManager.from(Employee.class) .leftOuterJoin("department") .orderBy("department.name DESC, name") .getResultList();
次のようになります.
jdbcManager.from(Employee.class) .leftOuterJoin(department()) .orderBy(desc(department().name()), asc(name())) .getResultList();
Service クラス
Service
クラスは,
S2JDBC-Gen
の
Gen-Service
タスクによって生成されるクラスです.
対応するエンティティの
names
クラスおよび
Operations
の
static
メソッドがあらかじめ static import されているため,
タイプセーフ API をすぐに利用することができます.
Service
クラスにあらかじめ生成されている
findAllOrderById()
メソッドの実装には, タイプセーフ API が使われています.
public List<Emp> findAllOrderById() { return select().orderBy(asc(id())).getResultList(); }