検索

検索は、すべて外部化されたSQLを使って行われます。

外部化されたSQLはすべてバインド変数(?)を使った準備された文に変換されて実行されますが、 このドキュメントでは、発行されたSQLがどのようなものかわかりやすくするためにバインド変数を実際の値に置き換えたログ用のSQLを示します。

src/test/java/tutorial/SelectTest.javaのtestSimpleSelectメソッドを参照してください。 引数をSQLファイルにバインディングして実行する単純な検索です。 バインディングにはバインド変数コメントを使用します。

使用するDaoのメソッド定義は次のとおりです。

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectById.sqlです。SQLは次のように記述されています。

Daoのメソッドは次のように呼び出します。

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestConditinalSelectメソッドを参照してください。 SQLファイル中に条件コメントを記述することで動的なSQLを発行できます。

使用するDaoのメソッド定義は次のとおりです。

selectByAgeRange(Integer min, Integer max);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByAgeRange.sqlです。SQLは次のように記述されています。

= /* min */10 /*%end */ /*%if max != null */ and age <= /* max */70 /*%end */ order by age]]>

1番目のパラメータに30、2番目のパラメータに40を渡してDaoのメソッドを呼び出します。

list = dao.selectByAgeRange(30, 40);]]>

SQLのログは次のように出力されます。

= 30 and age <= 40 order by age]]>

1番目のパラメータに30、2番目のパラメータにnullを渡してDaoのメソッドを呼び出します。

SQLのログは次のように出力されます。

= 30 order by age]]>

1番目のパラメータにnull、2番目のパラメータに40を渡してDaoのメソッドを呼び出します。

SQLのログは次のように出力されます。

1番目のパラメータにnull、2番目のパラメータにnullを渡してDaoのメソッドを呼び出します。

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestConditinalSelect2メソッドを参照してください。 SQLファイル中に条件コメントを記述することで動的なSQLを発行できますが、条件が成り立たない場合を /*%else*/ という式コメントで記述できます。

使用するDaoのメソッド定義は次のとおりです。

selectByName(String name);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByName.sqlです。SQLは次のように記述されています。

パラメータに"SMITH"を渡してDaoのメソッドを呼び出します。 この場合、name != null という条件が成り立ちます。

list = dao.selectByName("SMITH");]]>

SQLのログは次のように出力されます。

パラメータにnullを渡してDaoのメソッドを呼び出します。 この場合、name != null という条件は成り立ちません。

SQLのログは次のように出力されます。where句の直後のandは自動で除去されます。

elseだけではなくelseifを表すこともできます。 詳細はelseifとelseを参照してください。

src/test/java/tutorial/SelectTest.javaのtestLoopSelectメソッドを参照してください。 SQLファイル中に繰り返しコメントを記述することで、動的なSQLを発行できます。

使用するDaoのメソッド定義は次のとおりです。

selectByAges(List ages);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByAges.sqlです。SQLは次のように記述されています。 次の要素がある場合にのみ表示したい文字列(この例ではor)は、埋め込み変数コメントで表します。

Daoのメソッドは次のように呼び出します。

ages = Arrays.asList(30, 40, 50, 60); List list = dao.selectByAges(ages);]]>

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestInPredicateメソッドを参照してください。 IN述語を使った検索です。

使用するDaoのメソッド定義は次のとおりです。

selectByNames(List names);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByNames.sqlです。SQLは次のように記述されています。

Daoのメソッドは次のように呼び出します。

names = Arrays.asList("JONES", "SCOTT", "XXX"); List list = dao.selectByNames(names);]]>

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestLikePredicate_prefixメソッドを参照してください。 SQLファイル中で組み込み関数「@prefix()」を使用した前方一致検索ができます。 組み込み関数「@prefix()」を使用するとJavaのコード内で「%」を文字列に連結する処理が不要になります。

使用するDaoのメソッド定義は次のとおりです。

selectByNameWithPrefixMatching(String prefix);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByNameWithPrefixMatching.sqlです。SQLは次のように記述されています。

Daoのメソッドは次のように呼び出します。

list = dao.selectByNameWithPrefixMatching("S");]]>

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestLikePredicate_suffixメソッドを参照してください。 SQLファイル中で組み込み関数「@suffix()」を使用した後方一致検索ができます。 組み込み関数「@suffix()」を使用するとJavaのコード内で「%」を文字列に連結する処理が不要になります。

使用するDaoのメソッド定義は次のとおりです。

selectByNameWithSuffixMatching(String suffix);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByNameWithSuffixMatching.sqlです。SQLは次のように記述されています。

Daoのメソッドは次のように呼び出します。

list = dao.selectByNameWithSuffixMatching("S");]]>

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestLikePredicate_insideメソッドを参照してください。 SQLファイル中で組み込み関数「@contain()」を使用した中間一致検索ができます。 組み込み関数「@contain()」を使用するとJavaのコード内で「%」を文字列に連結する処理が不要になります。

使用するDaoのメソッド定義は次のとおりです。

selectByNameWithInsideMatching(String inside);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByNameWithInsideMatching.sqlです。SQLは次のように記述されています。

Daoのメソッドは次のように呼び出します。

list = dao.selectByNameWithInsideMatching("A");]]>

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestSelectByTimestampRangeメソッドを参照してください。 日付を用いて範囲検索を行う場合に、日付の時刻部分を切り捨てたり、日付を一日後ろへずらして切りのいい値にしたいことがあります。 そのような場合には、組み込み関数の「@roundDownTimePart()」と「@roundUpTimePart()」を使用します。

使用するDaoのメソッド定義は次のとおりです。

selectByHiredateRange(Timestamp from, Timestamp to);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByHiredateRange.sqlです。SQLは次のように記述されています。

= /* @roundDownTimePart(from) */'2001-01-01 12:34:56' and hiredate < /* @roundUpTimePart(to) */'2001-01-01 12:34:56']]>

Daoのメソッドは次のように呼び出します。

list = dao.selectByHiredateRange(from, to);]]>

SQLのログは次のように出力されます。

= '2008-01-20 00:00:00.0' and hiredate < '2008-03-21 00:00:00.0']]>

Javaコードからの引数と比べると時刻部分の切り捨てや切り上げが行われていることがわかります。

src/test/java/tutorial/SelectTest.javaのtestIsNotEmptyFunctionメソッドを参照してください。

文字シーケンスがnullかどうか、長さが0かどうかといった条件を基に条件分岐したい場合があります。たとえば、「nullでなくかつ長さが0でない場合にのみ検索条件に含める」には、次のようなSQLを記述できます。

しかし、上記のように書くのは冗長です。これを簡潔に記述するために、組み込み関数の「@isNotEmpty」が使用できます。 @isNotEmptyを使用すると次のように記述できます。 これは上記のSQLと意味的にはまったく同等です。

使用するDaoのメソッド定義は次のとおりです。 メソッドの定義は、@isNotEmptyの使用の有無に影響されません。

selectByNotEmptyName(String name);]]>

Daoのメソッドは次のように呼び出します。

list = dao.selectByNotEmptyName("SMITH");]]>

SQLのログは次のように出力されます。

引数にnullや空文字を渡した場合、実行されるSQLは変化します。

引数にnullや空文字を渡した場合、SQLのログは次のように出力されます。

文字シーケンスを扱う組み込み関数には、「@isNotEmpty」の他に、「@isEmpty」、「@isBlank」、「@isNotBlank」があります。 それぞれの説明については組み込み関数を参照してください。

src/test/java/tutorial/SelectTest.javaのtestSelectByDomainメソッドを参照してください。 ドメインを条件に使用した検索です。

使用するDaoのメソッド定義は次のとおりです。

selectBySalary(Salary salary);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectBySalary.sqlです。 SQLは次のように記述されています。 パラメータの型がドメインクラスであっても、SQLファイルでの扱い方は基本型と変わりません。

/* salary */0]]>

Daoのメソッドは次のように呼び出します。

list = dao.selectBySalary(new Salary(2900));]]>

SQLのログは次のように出力されます。

2900]]>

src/test/java/tutorial/SelectTest.javaのtestSelectByEntityメソッドを参照してください。 エンティティを条件に使用した検索です。

使用するDaoのメソッド定義は次のとおりです。

selectByExample(Employee e);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByExample.sqlです。 SQLは次のように記述されています。 パラメータの型がエンティティクラスの場合、SQLファイルの中ではドットを使用してエンティティのプロパティにアクセスできます。

Daoのメソッドは次のように呼び出します。

list = dao.selectByExample(e);]]>

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestOffsetLimitメソッドを参照してください。 ページングを行う検索です。

使用するDaoのメソッド定義は次のとおりです。 Daoのメソッドでは、SelectOptions型のパラメータを定義します。

selectAll(SelectOptions options);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectAll.sqlです。 SQLは次のように記述されています。 SQLにはORDER BY句の存在が必須です。

Daoのメソッドは次のように呼び出します。 SelectOptionsにoffsetとlimitを指定しています。

list = dao.selectAll(options); assertEquals(3, list.size());]]>

SQLのログは次のように出力されます。

src/test/java/tutorial/SelectTest.javaのtestCountメソッドを参照してください。 ページングと集計(ページングしない場合の全件数の取得)を同時に行う検索です。

使用するDaoのメソッド定義は次のとおりです。 Daoのメソッドでは、SelectOptions型のパラメータを定義します。

selectAll(SelectOptions options);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectAll.sqlです。 SQLは次のように記述されています。 SQLにはORDER BY句の存在が必須です。

Daoのメソッドは次のように呼び出します。 SelectOptionsのcountメソッドをあらかじめ呼び出しておきます。 Daoのメソッドを呼び出した後、SelectOptionsのgetCountメソッドにより集計結果を取得できます。

list = dao.selectAll(options); assertEquals(3, list.size()); assertEquals(14, options.getCount());]]>

SQLのログは次のように2つ出力されます。

src/test/java/tutorial/SelectTest.javaのtestIterateメソッドを参照してください。 SQLの結果セットを1件ずつエンティティなどのオブジェクトへインスタンス化する検索です。 メモリの使用量を抑えながら大量データを扱う場合に向いています。

使用するDaoのメソッド定義は次のとおりです。 @Selectのiterate要素にtrueを指定し、DaoのメソッドではIterationCallback型のパラメータを定義します。

R selectByAge(int age, IterationCallback callback);]]>

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectByAge.sqlです。 SQLは次のように記述されています。

/* age */0 order by age]]>

Daoのメソッドは次のように呼び出します。

() { private Salary sum = new Salary(0); @Override public Salary iterate(Employee target, IterationContext context) { Salary salary = target.getSalary(); if (salary != null) { sum = sum.add(salary); } return sum; } });]]>

SQLのログは次のように出力されます。

30 order by age]]>

src/test/java/tutorial/SelectTest.javaのtestSelectJoinedResultメソッドを参照してください。 結合した結果を取得する検索です。 結合した結果が複数テーブルのカラムを含む場合、取得対象カラムすべてに対応するプロパティをもったエンティティクラスが必要です。

使用するDaoのメソッド定義は次のとおりです。

selectAllEmployeeDepartment();]]>

戻り値のListの要素であるEmployeeDepartmentが結合した結果に対応するエンティティクラスです。 このエンティティクラスは、結合のベースとなるテーブルに対応するエンティティクラスを継承すると比較的に簡単に作成できます。

Daoメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/selectAllEmployeeDepartment.sqlです。 SQLは次のように記述されています。

Daoのメソッドは次のように呼び出します。

list = dao.selectAllEmployeeDepartment();]]>

SQLのログは次のように出力されます。