在我的Scala Playframework应用程序中,我正在尝试使用executeInsert
创建一个sms_token(类)。
然后使用主键创建唯一标记,将其添加到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 noob所以我不确定这是否正确..也许有更好的Scala方式?
答案 0 :(得分:5)
如果您在map
结果
executeInsert
,则会获得长ID
DB.withConnection { implicit connection =>
SQL("...").executeInsert().map(id => println(id))
}
答案 1 :(得分: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
属性。
注意:我正在尝试做到这一点并且偶然发现了这个问题。