2

私のScalaPlayframeworkアプリでexecuteInsert、sms_token(class)を作成しようとしています。次に、主キーを使用して一意のトークンを作成し、それをsms_tokenに追加して、で保存しexecuteUpdateます。

case class SmsToken(id: Option[Long], token: String, phoneNumber: String, startDate: Option[Date], endDate: Option[Date], used: Boolean, tempReviewGrade: Option[Int], tempReviewText: Option[String])

object SmsToken {
  val simple = {
    get[Option[Long]]("id") ~
      get[String]("token") ~
      get[String]("phone_number") ~
      get[Option[Date]]("start_date") ~
      get[Option[Date]]("end_date") ~
      get[Boolean]("used") ~
      get[Option[Int]]("temp_review_grade") ~
      get[Option[String]]("temp_review_text") map {
      case id ~ token ~ phone_number ~ start_date ~ end_date ~ used ~ temp_review_grade ~ temp_review_text => SmsToken(id, token, phone_number, start_date, end_date, used, temp_review_grade, temp_review_text)
    }
  }
}

方法:

 def createToken(n: String): Option[Long] = {

    var addedTokenPk = 0L

    val result = DB.withConnection {
      implicit connection =>
        SQL("insert into sms_token(token, phone_number, start_date, end_date, used, temp_review_grade, temp_review_text) values({token},{phone_number},{start_date},{end_date},{used}, {temp_review_grade}, {temp_review_text})").on(
          'token -> "",
          'phone_number -> n,
          'start_date -> new Date(),
          'end_date -> new Date(),
          'used -> 0,
          'temp_review_grade -> 0,
          'temp_review_text -> ""
        ).executeInsert()
    }
    result match {
      case Some(pk) => {
        addedTokenPk = pk.asInstanceOf[Long]
      }
      case None => println("YAAARRRRR")
    }

    if (addedTokenPk != 0L) {

      val token = Util.createUniqueToken(addedTokenPk)

      DB.withConnection {
        implicit connection =>
          SQL("update sms_token s set s.token={token} where s.id={id}").on(
            'id -> ("" + addedTokenPk).toLong,
            'token -> token
          ).executeUpdate()
      }
      return Some(addedTokenPk)
    }
    None
  }

私の質問はこの部分に関するものです:

result match {
    case Some(pk) => {
        addedTokenPk = pk.asInstanceOf[Long]
    }
    case None => println("YAAARRRRR")
}

executeInsertはAnyオブジェクトを返しますが、キーがLongでasInstanceOf[Long] あるため、後で更新部分で必要になるため、これを実行しています。私はScalaの初心者なので、これが正しいかどうかはわかりません。もっと良いScalaの方法があるのではないでしょうか。

4

2 に答える 2

5

結果を呼び出すmapと、LongIDが取得されますexecuteInsert

DB.withConnection { implicit connection =>
   SQL("...").executeInsert().map(id => println(id))
}
于 2013-03-06T14:53:16.603 に答える
0

別の方法は、simpleパーサーをexecuteInsertに渡すことです。

val result: SmsToken = DB.withConnection {
  implicit connection =>
    SQL("insert into sms_token(token, phone_number, start_date, end_date, used, temp_review_grade, temp_review_text) values({token},{phone_number},{start_date},{end_date},{used}, {temp_review_grade}, {temp_review_text})").on(
      'token -> "",
      'phone_number -> n,
      'start_date -> new Date(),
      'end_date -> new Date(),
      'used -> 0,
      'temp_review_grade -> 0,
      'temp_review_text -> ""
    ).executeInsert(simple.single)
}

これにより、多くの場合、上記を1回のパスで実行できます。この場合、pkとトークンにアクセスしてresult、データベースクエリの属性を参照できます。

注:私はこれを正確に実行しようとして検索していて、この質問に出くわしました。

于 2016-02-20T05:17:46.620 に答える