2013-03-06 1 views
2

В моем приложении Scala Playframework я пытаюсь с executeInsert создать sms_token (класс). Затем с помощью первичного ключа создайте уникальный токен, добавьте его в sms_token и сохраните его с помощью executeUpdate.Как мне удалить Любые возвращенные из executeInsert в Anorm to Long

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 возвращает Любой объект и так как ключ Долго я делаю asInstanceOf[Long] так как мне нужно это позже в части обновления. Я Scala noob, поэтому я не уверен, что это правильно. Может быть, есть лучший способ Scala?

ответ

5

Вы получаете идентификатор длиной, если вы вызываете map на executeInsert результате

DB.withConnection { implicit connection => 
    SQL("...").executeInsert().map(id => println(id)) 
} 
+0

hmm my executeInsert() не имеет метода .map. Наверное, я что-то упустил? – jakob

+0

'executeInsert()' возвращает параметр [Long], а опция имеет метод «map» – maxmc

+0

Я просто заметил, что ваш парсер выглядит странно: 'get [Option [Long]] (« id »)' должен быть 'get [Pk [Long]] ("id") 'может быть, это имеет значение. – maxmc

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) 
} 

Это часто позволяет сделать выше за один проход, и в этом случае у вас будет доступ к pk и токену, позволяющий ссылаться на атрибуты result в запросе базы данных.

Примечание: Я искал, чтобы попытаться сделать именно это и наткнулся на этот вопрос.