kotlinでJpaSpecificationExecutorを使い動的条件SQLを作成する

IT

JpaSpecificationExecutorの使いどころ

下記のような遊戯王のカード検索ができる画面があるとします。

カード名は「ヴァレル」から始まって、攻撃力3000かつ守備力2500のカードを検索したい場合、JpaSpecificationExecutorを使わないと複数のメソッドが必要になります。

・カード名をLIKE検索するメソッド
・カード名をLIKE検索し、かつ攻撃力で絞り込むメソッド
・カード名をLIKE検索し、かつ攻撃力と守備力で絞り込むメソッド
のように複数メソッドが必要になります。

上記画面のように検索したい項目数が多いとやってられません。
そこでJpaSpecificationExecutorで動的にクエリを作成します。

Repositoryの実装

普段のJPAと異なるのはJpaSpecificationExecutor<hogeEntity>を継承していることです。他は同じでOKです。

Controllerの実装

よく見るControllerです。
“/card/search”にアクセスするとカードを検索してViewを表示します。
JpaSpecificationExecutorを使用した検索は
seachService.getCardDatas(form)で処理しています。


Serviceの実装

RepositoryでJpaSpecificationExecutorを継承しているため
findAll(Specification<hogeEntity!>?)が使用可能になっています。

findAllの引数Specificationに各検索条件を設定します。
getCardDatas(form: SearchForm)は各条件をクリアしたデータを返すだけの単純なメソッドです。


Specification(検索条件)の実装

今回の肝の部分です。
各検索条件を作成しています。
大事なのはnullを返すことで検索条件を無効にできることです。

例えば最初の条件であるfun nameLike(name: String?)
引数のnameがnullの場合、nullをreturnしています。

これによりカード名のLIKE検索は無効化されます。
他の条件が正常であれば、
・指定した攻撃力
・指定した守備力
・指定した攻守合計値
・指定した種別
のカードが検索されます。

nullを返すと検索条件が無効化できる仕様を使って
動的クエリが作成できるのです。


まとめ

JpaSpecificationExecutorはJavaだと色々な日本語資料があるのに、
Kotlinだと少ないため、備忘録としてまとめました。

IT

Posted by raishin