S2JDBCタイプセーフAPI

概要

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(newSimpleWhere()
       
.eq("name", name)
       
.eq("department.name", deptName)
   
.getResultList();

次のようになります.

jdbcManager.from(Employee.class)
   
.innerJoin(department())
   
.where(newSimpleWhere()
       
.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(newSimpleWhere()
       
.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 が使われています.

    publicList<Emp> findAllOrderById(){
       
returnselect().orderBy(asc(id())).getResultList();
   
}
原文地址:https://www.cnblogs.com/aggavara/p/2726428.html