SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

ScalaのWebアプリケーションフレームワーク「Play Framework」入門
~(3)CRUD操作を行うWebアプリケーションの作成 後編

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第14回

簡単アプリの開発(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」の指定がサブクエリーになりました。

次のページ
簡単アプリの開発(3)

この記事は参考になりましたか?

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

前出 祐吾(TIS株式会社)(マエデ ユウゴ)

TIS株式会社 コーポレート本部 戦略技術センター所属。これまで社内向けWebアプリケーションフレームワークの開発やJenkinsの活用を中心に様々な手段で開発の効率化を図ってきた。現在は、さらに革命的な効率化を目指し、Scalaを活用した次世代開発基盤の研究&開発に従事している。システム開発は、泥...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7817 2014/06/20 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー