簡単アプリの開発(2)
「Events」オブジェクトに「find」メソッドを実装します。「eventId」と「eventNm」はそれぞれ入力された場合のみ検索条件に追加し、検索結果は「eventNm」の昇順でソートします。「eventId」は完全一致なので「===」、「eventNm」は部分一致なので「like」で比較し、検索した結果を「EventRow」オブジェクトのListで返却します。
[Model]Events.scala(/app/models)
/** 検索 */
def find(eventId: String, eventNm: String): List[EventRow] =
database.withTransaction { implicit session: Session =>
var q = if (eventId.isEmpty) Event else Event.filter(_.eventId === eventId)
q = if (eventNm.isEmpty) q else q.filter(_.eventNm like s"%$eventNm%")
q = q.sortBy(_.eventNm)
return q.list
}
以上でイベント検索画面が実装できましたので、「http://localhost:9000/event/」にアクセスし、画面を表示してみましょう。
検索ボタンで検索すると先ほど登録したデータが表示されました。
さて、「Events」オブジェクトの「find」メソッドに実装した「EVENT」テーブルの検索では、どのようなSQLが発行されているのでしょうか? デバッグログを出力して確認しておきましょう。作成したクエリーオブジェクトの「selectStatement」メソッドを呼び出すと、発行するSQL文字列を取得することができます。「play.Logger」を使用して、デバッグログを出力してみましょう。
[Model]Events.scala(/app/models)
import play.Logger
/** 検索 */
def find(eventId: String, eventNm: String): List[EventRow] =
database.withTransaction { implicit session: Session =>
var q = if (eventId.isEmpty) Event else Event.filter(_.eventId === eventId)
q = if (eventNm.isEmpty) q else q.filter(_.eventNm like s"%$eventNm%")
q = q.sortBy(_.eventNm)
Logger.debug(q.selectStatement)
return q.list
}
検索条件を入力せずに検索すると、次のようなログが出力されました。
検索条件を入力しなかった場合
[debug] application - select x2."ID", x2."EVENT_ID", x2."EVENT_NM" from "TECHAPP"."EVENT" x2 order by x2."EVENT_NM" T_NM"
SQLの部分を切り出して整形すると次のようになります。
select x2."ID",
x2."EVENT_ID",
x2."EVENT_NM"
from "TECHAPP"."EVENT" x2
order by x2."EVENT_NM"
「イベントID」のみ入力した場合
select x2."ID",
x2."EVENT_ID",
x2."EVENT_NM"
from "TECHAPP"."EVENT" x2
where x2."EVENT_ID" = '00001'
order by x2."EVENT_NM"
「イベント名」のみ入力した場合
select x2."ID",
x2."EVENT_ID",
x2."EVENT_NM"
from "TECHAPP"."EVENT" x2
where x2."EVENT_NM" like '%Scala%'
order by x2."EVENT_NM"
「イベントID」「イベント名」を入力した場合
select x2."ID",
x2."EVENT_ID",
x2."EVENT_NM"
from "TECHAPP"."EVENT" x2
where (x2."EVENT_ID" = '00001')
and (x2."EVENT_NM" like '%Scala%')
order by x2."EVENT_NM"
想定通りのSQLが発行されていましたでしょうか? ちなみに、「sortBy」と「filter」の順序を入れ替えると発行されるSQLが異なりますので注意が必要です。
[Model]Events.scala(/app/models)
import play.Logger
/** 検索 */
def find(eventId: String, eventNm: String): List[EventRow] =
database.withTransaction { implicit session: Session =>
var q = Event.sortBy(_.eventNm)
q = if (eventId.isEmpty) q else q.filter(_.eventId === eventId)
q = if (eventNm.isEmpty) q else q.filter(_.eventNm like s"%$eventNm%")
Logger.debug(q.selectStatement)
return q.list
}
「イベントID」「イベント名」を入力した場合
select x2."ID",
x2."EVENT_ID",
x2."EVENT_NM"
from (select x3."ID" as "ID",
x3."EVENT_ID" as "EVENT_ID",
x3."EVENT_NM" as "EVENT_NM"
from "TECHAPP"."EVENT" x3
order by x3."EVENT_NM") x2
where (x2."EVENT_ID" = '00001')
and (x2."EVENT_NM" like '%Scala%')
「order by」の指定がサブクエリーになりました。

