Liftの入門(lift-mapperのquery編)

今回はlift-mapperのQuery関係をまとめます。MappedFieldが先なのではと思わないでもないですがQueryです。lift-mapperは、toFormやtoHtmlであったりモデルのくせにビューにくっついていたり色々知っておかなくてはいけないことがあるのですが、まずはQuery関係に絞って説明します。リファレンス的に使えればと思います。

本題に入る前にちょっとTips

発行したSQLのログを出したい

Boot.scalaに以下を記述

class Boot extends LazyLoggable {
    ・・・
    DB.addLogFunc {
      case (query, time) => {
        logger.info("All queries took " + time + "ms: ")
        query.allEntries.foreach({ case DBLogEntry(stmt, duration) => logger.info(stmt + " took " + duration + "ms")})
        logger.info("End queries")
      }
    }

テーブルを自動で作成したい

Boot.scalaに記述します。

Schemifier.schemify(true, Schemifier.infoF _, modelのobject名)

テーブル名やカラム名を_(アンダーバー)区切りにする

デフォルトだとemployeeNameのようなカラムでテーブルが作成されたり、sqlが発行されたりするので、それをemployee_nameに変える方法です。これもBoot.scalaに記述します。

    LiftRules.stripComments.default.set(() => false)

    import net.liftweb.util.Helpers
    MapperRules.columnName = (_,name) => Helpers.snakify(name)
    MapperRules.tableName = (_,name) => Helpers.snakify(name)

scalaのコンソールでBoot.scalaを動かしたい。

コンソールを起動して以下を入力。

scala>(new bootstrap.liftweb.Boot).boot 


では本題に入ります。なお、完全に網羅するものではないのであしからず。

データをinsertする。

戻り値がbooleanの場合。保存に成功すればtrue。

val result = Employee.create.name("test").jobType(JobType.ANALYST).salary(300).save

戻り値がmodel。

val emp = Employee.create.name("test").jobType(JobType.ANALYST).salary(300).saveMe

keyで1件取得する。

val emp: Box[Employee] = Employee.find(1)

全件取得する。

val empList : List[Employee] = Employee.findAll

条件を指定する。

SQLとしては、「where id > 5」となる。

val empList : List[Employee] = Employee.findAll(By_>(Employee.id, 5))

逆もあります。「where id < 5」

val empList : List[Employee] = Employee.findAll(By_<(Employee.id, 5))

イコールもいけます。「where id = 5」

val empList : List[Employee] = Employee.findAll(By(Employee.id, 5))

検索結果を削除する。

modelのobjectから消すにはdelete_!を使います。

val emp: Employee = Employee.find(1).open_!
val result: Boolean = Employee.delete_!(emp)

※open_!はBox型から値を取得

条件指定で削除する。

条件を指定するにはbulkDelete_!!を使います。ここではLikeを使っています。findAllとかでもLike使えます。

val result: Boolean = Employee.bulkDelete_!!(Like(Employee.name, "山田%"))

件数を取得する。

件数を取得するにはcountを利用します。

val count: Long = Employee.count

条件指定も出来ます。

val count: Long = Employee.count(By(Employee.name, "山田 太郎"))

order byを指定する。

descの場合

Employee.findAll(OrderBy(Employee.name,Descending))

ascの場合(複数も指定出来ます)

Employee.findAll(OrderBy(Employee.name,Ascending),OrderBy(Employee.jobType, Ascending))

取得する件数と何件目から取得するか指定する。

以下だと10件目から5件取得する。

val empList: List[Employee] = Employee.findAll(StartAt(10),MaxRows(5))

SQLを直接発行する。

一つ目のリストにヘッダ名、二つ目のリストに値のリストが取れます。

    val resultList: (List[String], List[List[String]]) =
      DB.runQuery("select * from employee")

    val headerList: List[String] = resultList._1
    val bodyList: List[List[String]] = resultList._2

とりあえず、ざっくりとはこんな感じです。まだまだあるのですが僕自身がリファレンス的に参照しててあった方が便利だと感じたら追加します。